<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Organizacja i Architektura systemów - 2025 on Side Effects</title><link>https://marcinklimek.github.io/student/2025-arch/</link><description>Recent content in Organizacja i Architektura systemów - 2025 on Side Effects</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Sat, 01 Nov 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://marcinklimek.github.io/student/2025-arch/index.xml" rel="self" type="application/rss+xml"/><item><title>Organizacja zajęć</title><link>https://marcinklimek.github.io/student/2025-arch/organizacja-zaj%C4%99%C4%87/</link><pubDate>Sun, 02 Nov 2025 00:00:00 +0000</pubDate><guid>https://marcinklimek.github.io/student/2025-arch/organizacja-zaj%C4%99%C4%87/</guid><description>&lt;h2 id="zasady-wspólnej-pracy">Zasady wspólnej pracy&lt;/h2>
&lt;p>&lt;strong>Maksymalna liczba punktów: 50&lt;/strong>&lt;/p>
&lt;p>Rozkład punktów:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Obecność:&lt;/strong> 10 punktów (2 punkty za każde zajęcia)&lt;/li>
&lt;li>&lt;strong>Realizacja zadań/projektu:&lt;/strong> 40 punktów&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Nowy Rok Akademicki 2025/2026&lt;/strong>&lt;/p>
&lt;p>Zgodnie z obowiązkami określonymi przez Pana Dziekana Jerzego Choroszczaka:&lt;/p>
&lt;p>Podczas zajęć ćwiczeniowych/laboratoryjnych studenci mają &lt;strong>obowiązek uczestniczenia w nich z włączonymi kamerkami.&lt;/strong>
Brak włączonej kamerki jest równoznaczny z &lt;strong>brakiem obecności na zajęciach&lt;/strong>.&lt;/p>
&lt;h3 id="wybór-ścieżki-realizacji">Wybór ścieżki realizacji&lt;/h3>
&lt;p>Na pierwszych zajęciach (Lab 01) należy wybrać jedną z dwóch ścieżek:&lt;/p></description><content:encoded><![CDATA[<h2 id="zasady-wspólnej-pracy">Zasady wspólnej pracy</h2>
<p><strong>Maksymalna liczba punktów: 50</strong></p>
<p>Rozkład punktów:</p>
<ul>
<li><strong>Obecność:</strong> 10 punktów (2 punkty za każde zajęcia)</li>
<li><strong>Realizacja zadań/projektu:</strong> 40 punktów</li>
</ul>
<p><strong>Nowy Rok Akademicki 2025/2026</strong></p>
<p>Zgodnie z obowiązkami określonymi przez Pana Dziekana Jerzego Choroszczaka:</p>
<p>Podczas zajęć ćwiczeniowych/laboratoryjnych studenci mają <strong>obowiązek uczestniczenia w nich z włączonymi kamerkami.</strong>
Brak włączonej kamerki jest równoznaczny z <strong>brakiem obecności na zajęciach</strong>.</p>
<h3 id="wybór-ścieżki-realizacji">Wybór ścieżki realizacji</h3>
<p>Na pierwszych zajęciach (Lab 01) należy wybrać jedną z dwóch ścieżek:</p>
<ul>
<li><strong>Ścieżka A:</strong> Projekt zespołowy (2 osoby)</li>
<li><strong>Ścieżka B:</strong> Zadania indywidualne</li>
</ul>
<p><strong>Brak wyboru</strong> na Lab 01 oznacza automatyczne przypisanie do <strong>Ścieżki B</strong>.</p>
<p><strong>Zmiana ścieżki</strong> jest możliwa w trakcie semestru (A  - B), jednak wiąże się ze wszystkimi konsekwencjami dotyczącymi punktacji i terminów (zadania/projekt muszą być uzupełnione zgodnie z zasadami opóźnień).</p>
<h4 id="ścieżka-a-projekt-zespołowy">Ścieżka A (Projekt zespołowy)</h4>
<h5 id="punktacja">Punktacja</h5>
<ul>
<li>Prezentacja postępów (5 spotkań po 5 pkt): 25 punktów</li>
<li>Jakość kodu i dokumentacji: 10 punktów (finalnie)</li>
<li>Finalna funkcjonalność projektu: 5 punktów (finalnie)</li>
</ul>
<p><strong>Ważne:</strong> Oceniane jest zaangażowanie i proces pracy, nie tylko końcowy efekt. Program nie musi działać w 100%, aby otrzymać punkty. Liczy się systematyczna praca, dokumentowanie problemów i prób ich rozwiązania.</p>
<h5 id="wymagania">Wymagania</h5>
<ul>
<li><strong>Zespoły:</strong> 2 osoby</li>
<li><strong>Podział pracy:</strong> równy, bez oceniania indywidualnego wkładu</li>
<li><strong>Minimalne wymagania:</strong>
<ul>
<li>Projekt musi przypominać wybrany temat</li>
<li>Musi posiadać dokumentację</li>
<li>Należy być przygotowanym na pytania: &ldquo;Dlaczego tak, a nie inaczej?&rdquo;</li>
</ul>
</li>
<li><strong>Środowisko:</strong> Projekt musi działać w 16-bit DOS, uruchamiany w DOSBox</li>
<li><strong>Środowisko na ostatnie zajęcia (nr 5):</strong> Dowolne środowisko z kompilatorem C++</li>
</ul>
<h5 id="tematy-projektów">Tematy projektów</h5>
<p>Każdy projekt może być realizowany w trybie tekstowym lub graficznym (assembler):</p>
<ol>
<li><strong>Snake</strong> - Sterowanie klawiszami, zjadanie punktów</li>
<li><strong>Pong</strong> - Dwie paletki, piłka, kolizje, przeciwnik</li>
<li><strong>Animacja sprite-ów w mode 13h</strong> - Sprite poruszający się po ekranie, kolizje ze ścianami, kilka klatek animacji (jak wygaszacz DVD)</li>
<li><strong>Kalkulator RPN</strong> - Stos, operacje <code>+ - * /</code>, wejście z klawiatury, liczby zmiennoprzecinkowe</li>
<li><strong>Gra Labirynt</strong> - Generowanie labiryntu i poruszanie się w nim (marker pozycji)</li>
<li><strong>Arkanoid / Breakout</strong> - Sterowanie paletką, odbijanie piłki, kasowanie klocków</li>
<li><strong>Tetris</strong> - Spadające klocki, obracanie, kasowanie linii, przyśpieszanie, punktacja</li>
<li><strong>Edytor tekstu</strong> - Wpisywanie tekstu, obsługa kursorem, zapisywanie/wczytywanie plików</li>
<li><strong>Kompresor plików</strong> - Algorytm kompresji (np. RLE), kompresja i dekompresja</li>
<li><strong>Gra w życie Conway&rsquo;a</strong> - Automat komórkowy, wizualizacja, edycja stanu, animacja</li>
<li>Symulator dowolnej wybranej architektury - symulator procesora i ew. peryferiów (to rozwiązanie może być realizowane w C++, Python, C# lub inny popularny język)
<ol>
<li>Przykładowo - podzbiór instrukcji procesora 6502 i tryb tekstowy. Prosty parser do asemblera i uruchamianie testowych programów.</li>
<li>Ważne aby implementacja miała instrukcje dostępu do rejestrów, pamięci, można było wykonywać pętle i pisać po ekranie.</li>
</ol>
</li>
</ol>
<p>Zasada takiego projektu - na tyle powinien być rozbudowany, aby na każdych zajęciach można było prezentować postęp pracy. Należy również uwzględnić odpowiedni zakres w przypadku grupy (2 osoby).</p>
<h5 id="prezentacja">Prezentacja</h5>
<p>Każda grupa przedstawia na zajęciach <strong>numer 2, 3, 4</strong></p>
<ul>
<li><strong>Pokaz działania</strong> - uruchomienie programu w DOSBox, demonstracja funkcjonalności</li>
<li><strong>Omówienie zastosowanych rozwiązań</strong> - architektura kodu, kluczowe procedury</li>
<li><strong>Napotkane problemy</strong> - trudności techniczne, błędy, sposób ich rozwiązania</li>
<li>Liczy się systematyczna praca, dokumentowanie problemów i prób ich rozwiązania</li>
<li><strong>Odpowiedzi na pytania</strong> prowadzącego o ile będą</li>
<li><strong>Czas prezentacji:</strong>  maksymalnie kilka minut</li>
</ul>
<h5 id="forma-oddawania-zadań">Forma oddawania zadań</h5>
<p>Paczka ZIP przesłana do CloudA zawierająca:</p>
<ul>
<li>Kod źródłowy (.asm)</li>
<li>Skompilowany program (.exe lub .com)</li>
<li>Dokumentacja/sprawozdanie (PDF/MD)</li>
<li>Dodatkowo mile widziany link do <strong>publicznego repozytorium</strong> jeśli tam znajduje się kod</li>
</ul>
<h4 id="ścieżka-b-zadania-indywidualne">Ścieżka B (zadania indywidualne)</h4>
<h5 id="punktacja-1">Punktacja</h5>
<ul>
<li>Blok 1 (zadania 1-5): 7 punktów         (do 12.12.2025)</li>
<li>Blok 2 (zadania 6-10): 8 punktów       (do 02.01.2026)</li>
<li>Blok 3 (zadania 11-15): 12 punktów   (do 09.01.2026)</li>
<li>Blok 4 (zadania 16-20): 13 punktów   (do 23.01.2026)</li>
</ul>
<h5 id="wymagania-1">Wymagania</h5>
<ul>
<li>Praca indywidualna</li>
<li><strong>Środowisko:</strong> 16-bit DOS (DOSBox)</li>
<li><strong>Środowisko na ostatnie zajęcia (nr 5):</strong> Dowolne środowisko z kompilatorem C++</li>
</ul>
<h5 id="omawianie-rozwiązań">Omawianie rozwiązań</h5>
<p>Na zajęciach <strong>numer 2,3,4</strong> rozwiązania zadań wybranych osób</p>
<ul>
<li><strong>Pokaz działania</strong> - uruchomienie programu w DOSBox</li>
<li><strong>Napotkane problemy</strong> - trudności techniczne, błędy, sposób ich rozwiązania</li>
<li><strong>Odpowiedzi na pytania</strong> prowadzącego o ile będą</li>
</ul>
<h5 id="tematy">Tematy</h5>
<h5 id="blok-1-podstawy-io-i-operacje-na-danych-zadania-1-5">BLOK 1: Podstawy I/O i operacje na danych (Zadania 1-5)</h5>
<ul>
<li><strong>Zadanie 1: Hello World</strong> Wyświetl na ekranie swoje imię i nazwisko, zakończ program.</li>
<li><strong>Zadanie 2: Wczytaj i wyświetl znak</strong> Wczytaj wyłącznie cyfry z klawiatury i wyświetl je na ekranie. Znaki pomijaj.</li>
<li><strong>Zadanie 3: Suma dwóch liczb jednocyfrowych</strong> Wczytaj dwie cyfry (znaki &lsquo;0&rsquo;-&lsquo;9&rsquo;), oblicz ich sumę i wyświetl wynik jako znak (od A do Z). - tablica kodów ASCII (<a href="https://pl.wikipedia.org/wiki/ASCII">ASCII – Wikipedia, wolna encyklopedia</a>)</li>
<li><strong>Zadanie 4: Konwersja małe/wielkie litery</strong> Wczytaj znak. Jeśli to mała litera, zamień na wielką. Jeśli wielka, zamień na małą. Wyświetl wynik.</li>
<li><strong>Zadanie 5: Wyświetlanie ciągu znaków w pętli</strong> Wyświetl 10 razy znak &lsquo;*&rsquo; w jednej linii, używając pętli z rejestrem CX.</li>
</ul>
<h5 id="blok-2-tablice-i-łańcuchy-zadania-6-10">BLOK 2: Tablice i łańcuchy (Zadania 6-10)</h5>
<blockquote>
<p>zostaną podane na zajęciach numer 2</p>
</blockquote>
<h5 id="blok-3-procedury-arytmetyka-i-logika-zadania-11-15">BLOK 3: Procedury, arytmetyka i logika (Zadania 11-15)</h5>
<blockquote>
<p>zostaną podane na zajęciach numer 3</p>
</blockquote>
<h5 id="blok-4-wielowątkowość-zadania-16-20">BLOK 4: Wielowątkowość (Zadania 16-20)</h5>
<blockquote>
<p>zostaną podane na zajęciach numer 3</p>
</blockquote>
<h2 id="zasady-wspólne">Zasady wspólne</h2>
<ul>
<li><strong>Współpraca jest wskazana</strong> - konsultacje, wymiana pomysłów, dyskusje techniczne</li>
<li><strong>Niedozwolone:</strong> oddawanie identycznych rozwiązań</li>
<li><strong>Dozwolone:</strong> wspólne procedury pomocnicze (np. wyświetlanie, konwersje)</li>
<li><strong>Wymagane:</strong> główna logika programu musi być własna</li>
<li>Na każdych zajęciach:
<ul>
<li>prezentuję przykładowy kod,</li>
<li>omawiam go,</li>
<li>mamy czas na pytania</li>
<li>następnie pozostawiam czas na realizację zadań z bloku, lub pracę na projektem.</li>
</ul>
</li>
</ul>
<h3 id="terminy">Terminy</h3>
<ul>
<li><strong>Lab 01:</strong> Wybór ścieżki realizacji, utworzenie repozytoriów/setup środowiska</li>
<li><strong>Lab 02-04:</strong> Systematyczna praca nad projektem/zadaniami,
<ul>
<li>postępy prac zespołów ze ścieżki A</li>
<li>omówienie zadań ze ścieżki B</li>
</ul>
</li>
<li><strong>Lab 05:</strong> Finalne prezentacje projektów i oddanie ostatnich zadań</li>
</ul>
<ul>
<li>Zadania należy oddać do piątku przed zajęciami.</li>
<li>Każdy tydzień opóźnienia <strong>obniża punktację o 3</strong></li>
</ul>
<p><strong>Przykładowo</strong></p>
<table>
  <thead>
      <tr>
          <th>w terminie</th>
          <th>do tyg. później</th>
          <th>do dwóch tyg. później</th>
          <th>do trzech tyg. później</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>7</td>
          <td>4</td>
          <td>1</td>
          <td>0</td>
      </tr>
  </tbody>
</table>
<h3 id="nieobecności">Nieobecności</h3>
<ul>
<li>W przypadku nieobecności należy skontaktować się z prowadzącym</li>
<li>Oddanie zadań nadal obowiązuje, należy uzupełnić braki</li>
</ul>
<h3 id="forma-oddawania-zadań-1">Forma oddawania zadań</h3>
<p>Paczka ZIP przesłana do CloudA zawierająca:</p>
<ul>
<li>Kod źródłowy (.asm)</li>
<li>Skompilowany program (.exe lub .com)</li>
<li>Dokumentacja/sprawozdanie (PDF/MD)</li>
<li>Dodatkowo mile widziany link do <strong>publicznego repozytorium</strong> jeśli tam znajduje się kod</li>
</ul>
<h2 id="kontakt-z-prowadzącym">Kontakt z prowadzącym</h2>
<p>Wszelkie pytania, sprawy organizacyjne i oddawanie prac poprzez <strong>system CloudA</strong></p>
]]></content:encoded></item><item><title>Skrypt</title><link>https://marcinklimek.github.io/student/2025-arch/skrypt/</link><pubDate>Sun, 02 Nov 2025 00:00:00 +0000</pubDate><guid>https://marcinklimek.github.io/student/2025-arch/skrypt/</guid><description>&lt;h1 id="wstęp-do-asemblera-x86-16-bit">Wstęp do Asemblera x86 16-bit&lt;/h1>
&lt;h2 id="1-czym-jest-asembler-i-architektura-x86">1. Czym jest asembler i architektura x86?&lt;/h2>
&lt;p>&lt;strong>Asembler&lt;/strong> to język programowania niskiego poziomu, w którym każda instrukcja odpowiada niemal bezpośrednio jednej operacji procesora. Programujemy &amp;ldquo;blisko sprzętu&amp;rdquo;.&lt;/p>
&lt;p>&lt;strong>Architektura x86&lt;/strong> to rodzina procesorów zapoczątkowana przez Intel 8086 (1978). Procesor 16-bitowy oznacza, że podstawowa jednostka danych to 16 bitów (2 bajty).&lt;/p>
&lt;h2 id="2-tryby-pracy-procesora-x86">2. Tryby pracy procesora x86&lt;/h2>
&lt;p>Procesor x86 może działać w różnych trybach:&lt;/p>
&lt;h3 id="real-mode-tryb-rzeczywisty">Real Mode (Tryb rzeczywisty)&lt;/h3>
&lt;ul>
&lt;li>Oryginalny tryb procesora 8086&lt;/li>
&lt;li>Dostęp do maksymalnie 1 MB pamięci (20-bitowy adres)&lt;/li>
&lt;li>Brak ochrony pamięci&lt;/li>
&lt;/ul>
&lt;h3 id="protected-mode-tryb-chroniony">Protected Mode (Tryb chroniony)&lt;/h3>
&lt;ul>
&lt;li>Wprowadzony w 80286&lt;/li>
&lt;li>Pełna ochrona pamięci, wielozadaniowość&lt;/li>
&lt;li>32-bitowe adresy (dostęp do 4 GB RAM)&lt;/li>
&lt;/ul>
&lt;h2 id="3-segmentacja-pamięci">3. Segmentacja pamięci&lt;/h2>
&lt;h3 id="problem-adresowania">Problem adresowania&lt;/h3>
&lt;p>Procesor 16-bitowy może operować na liczbach 0-65535 (FFFFh). Jak więc dostać się do 1 MB pamięci (adresy 0-1048575)?&lt;/p></description><content:encoded><![CDATA[<h1 id="wstęp-do-asemblera-x86-16-bit">Wstęp do Asemblera x86 16-bit</h1>
<h2 id="1-czym-jest-asembler-i-architektura-x86">1. Czym jest asembler i architektura x86?</h2>
<p><strong>Asembler</strong> to język programowania niskiego poziomu, w którym każda instrukcja odpowiada niemal bezpośrednio jednej operacji procesora. Programujemy &ldquo;blisko sprzętu&rdquo;.</p>
<p><strong>Architektura x86</strong> to rodzina procesorów zapoczątkowana przez Intel 8086 (1978). Procesor 16-bitowy oznacza, że podstawowa jednostka danych to 16 bitów (2 bajty).</p>
<h2 id="2-tryby-pracy-procesora-x86">2. Tryby pracy procesora x86</h2>
<p>Procesor x86 może działać w różnych trybach:</p>
<h3 id="real-mode-tryb-rzeczywisty">Real Mode (Tryb rzeczywisty)</h3>
<ul>
<li>Oryginalny tryb procesora 8086</li>
<li>Dostęp do maksymalnie 1 MB pamięci (20-bitowy adres)</li>
<li>Brak ochrony pamięci</li>
</ul>
<h3 id="protected-mode-tryb-chroniony">Protected Mode (Tryb chroniony)</h3>
<ul>
<li>Wprowadzony w 80286</li>
<li>Pełna ochrona pamięci, wielozadaniowość</li>
<li>32-bitowe adresy (dostęp do 4 GB RAM)</li>
</ul>
<h2 id="3-segmentacja-pamięci">3. Segmentacja pamięci</h2>
<h3 id="problem-adresowania">Problem adresowania</h3>
<p>Procesor 16-bitowy może operować na liczbach 0-65535 (FFFFh). Jak więc dostać się do 1 MB pamięci (adresy 0-1048575)?</p>
<h3 id="rozwiązanie-adresowanie-segmentoffset">Rozwiązanie: adresowanie segment:offset</h3>
<p><strong>Adres fizyczny</strong> = Segment × 16 + Offset</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Segment:  1234h
</span></span><span class="line"><span class="cl">Offset:   5678h
</span></span><span class="line"><span class="cl">──────────────────
</span></span><span class="line"><span class="cl">Fizyczny: 1234h × 10h + 5678h = 12340h + 5678h = 179B8h
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="segmenty-w-procesorze">Segmenty w procesorze</h3>
<p>Procesor ma specjalne rejestry segmentowe:</p>
<ul>
<li><strong>CS</strong> (Code Segment) - kod programu</li>
<li><strong>DS</strong> (Data Segment) - dane</li>
<li><strong>SS</strong> (Stack Segment) - stos</li>
<li><strong>ES</strong> (Extra Segment) - dodatkowy segment danych</li>
</ul>
<p><strong>Przykład dostępu do pamięci:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="no">ds</span><span class="p">:[</span><span class="mi">0100</span><span class="no">h</span><span class="p">]</span>  <span class="c1">; czytaj z DS:0100h
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="no">es</span><span class="p">:[</span><span class="no">bx</span><span class="p">]</span>     <span class="c1">; czytaj z ES:BX
</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="4-jak-dos-uruchamia-program">4. Jak DOS uruchamia program?</h2>
<h3 id="krok-po-kroku">Krok po kroku:</h3>
<ol>
<li>
<p><strong>Załadowanie do pamięci</strong></p>
<ul>
<li>DOS rezerwuje blok pamięci</li>
<li>Ładuje plik .EXE lub .COM</li>
</ul>
</li>
<li>
<p><strong>Tworzenie PSP (Program Segment Prefix)</strong></p>
<ul>
<li>256-bajtowy obszar przed programem</li>
<li>Zawiera informacje środowiskowe, linię komend (80h, 81h-FFh)</li>
</ul>
</li>
<li>
<p><strong>Ustawienie rejestrów segmentowych</strong></p>
<ul>
<li>CS:IP wskazuje na punkt wejścia</li>
<li>DS i ES wskazują na PSP</li>
<li>SS:SP wskazuje na stos</li>
</ul>
</li>
<li>
<p><strong>Przekazanie sterowania</strong></p>
<ul>
<li>Skok do programu (CS:IP)</li>
</ul>
</li>
<li>
<p><strong>Po zakończeniu</strong></p>
<ul>
<li>Program wywołuje INT 21h, funkcja 4Ch</li>
<li>DOS zwalnia pamięć i przywraca kontrolę</li>
</ul>
</li>
</ol>
<h2 id="5-różnica-między-plikami-com-i-exe">5. Różnica między plikami COM i EXE</h2>
<table>
  <thead>
      <tr>
          <th>Cecha</th>
          <th>COM</th>
          <th>EXE</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Rozmiar</strong></td>
          <td>Max 64 KB - 256 B</td>
          <td>Praktycznie nieograniczony</td>
      </tr>
      <tr>
          <td><strong>Struktura</strong></td>
          <td>Prosty kod binarny</td>
          <td>Nagłówek + kod + dane</td>
      </tr>
      <tr>
          <td><strong>Segmenty</strong></td>
          <td>Wszystko w jednym</td>
          <td>Oddzielne CS, DS, SS</td>
      </tr>
      <tr>
          <td><strong>Punkt wejścia</strong></td>
          <td>Zawsze 0100h</td>
          <td>Określony w nagłówku</td>
      </tr>
      <tr>
          <td><strong>Relokacja</strong></td>
          <td>Nie</td>
          <td>Tak (adresy poprawiane)</td>
      </tr>
      <tr>
          <td><strong>Łatwość</strong></td>
          <td>Prostszy</td>
          <td>Bardziej elastyczny</td>
      </tr>
  </tbody>
</table>
<h3 id="exe">EXE</h3>
<ul>
<li><strong>Nagłówek EXE (MZ header)</strong> - 28 bajtów minimalnie:
<ul>
<li>Sygnatura &ldquo;MZ&rdquo; (4Dh 5Ah)</li>
<li>Rozmiar ostatniej strony</li>
<li>Liczba stron ( 512-bajtowych)</li>
<li>Liczba wpisów relokacyjnych</li>
<li>Rozmiar nagłówka w paragrafach</li>
<li>Minimalna/maksymalna pamięć dodatkowa</li>
<li>Początkowe wartości SS:SP i CS:IP</li>
<li>Offset tabeli relokacji</li>
</ul>
</li>
<li><strong>Tablica relokacji</strong> - lista adresów wymagających modyfikacji</li>
<li><strong>Kod programu</strong> - segment CODE z instrukcjami</li>
<li><strong>Dane programu</strong> - segment DATA z zainicjalizowanymi danymi</li>
<li><strong>Segment stosu</strong> - STACK (jeśli zdefiniowany dyrektywą <code>.stack</code>)</li>
</ul>
<h3 id="relokacja-w-exe">Relokacja w EXE</h3>
<p>Program EXE jest <strong>relokowalny</strong>, ponieważ:</p>
<ul>
<li>Może być ładowany pod <strong>dowolny adres w pamięci</strong></li>
<li>Zawiera <strong>tabelę relokacji</strong> z adresami, które trzeba poprawić</li>
<li>Przy ładowaniu, DOS:
<ol>
<li>Wczytuje program do pamięci</li>
<li>Odczytuje tabelę relokacji</li>
<li>Dla każdego wpisu dodaje <strong>adres segmentu ładowania</strong> do wartości pod wskazanym adresem</li>
<li>Ustawia CS:IP i SS:SP zgodnie z nagłówkiem</li>
</ol>
</li>
</ul>
<blockquote>
<p>Jeśli kod zawiera <code>MOV AX, SEG dane</code> i program załadowano pod segment 1000h, DOS doda 1000h do wartości segmentu zapisanej w kodzie.</p>
</blockquote>
<h3 id="brak-relokacji-w-com">Brak relokacji w COM</h3>
<p>Program COM jest <strong>nierelokowalny</strong>:</p>
<ul>
<li>Jest zawsze ładowany pod <strong>stały adres 100h</strong> (w segmencie PSP)</li>
<li>Wszystkie adresy są obliczone na etapie kompilacji dla tego konkretnego offsetu</li>
<li>Nie ma nagłówka ani tabeli relokacji</li>
<li>Cały segment (CS=DS=ES=SS) wskazuje na ten sam obszar pamięci</li>
<li>Program jest po prostu &ldquo;zrzutem pamięci&rdquo; gotowym do wykonania</li>
</ul>
<h2 id="6-dyrektywy-asemblera-masm">6. Dyrektywy asemblera MASM</h2>
<p>Dyrektywy to instrukcje <strong>dla asemblera</strong>, nie dla procesora. Nie generują kodu maszynowego, tylko organizują program.</p>
<h3 id="model-small"><code>.model small</code></h3>
<p>Określa <strong>model pamięci</strong> programu. <strong>Wpływa bezpośrednio</strong> na generowany kod maszynowy.</p>
<table>
  <thead>
      <tr>
          <th>Model</th>
          <th>Kod</th>
          <th>Dane</th>
          <th>Opis</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>tiny</strong></td>
          <td>64 KB</td>
          <td>razem z kodem</td>
          <td>Dla .COM</td>
      </tr>
      <tr>
          <td><strong>small</strong></td>
          <td>64 KB</td>
          <td>64 KB</td>
          <td>Standardowy</td>
      </tr>
      <tr>
          <td><strong>medium</strong></td>
          <td>&gt;64 KB</td>
          <td>64 KB</td>
          <td>Duży kod</td>
      </tr>
      <tr>
          <td><strong>compact</strong></td>
          <td>64 KB</td>
          <td>&gt;64 KB</td>
          <td>Dużo danych</td>
      </tr>
      <tr>
          <td><strong>large</strong></td>
          <td>&gt;64 KB</td>
          <td>&gt;64 KB</td>
          <td>Wszystko duże</td>
      </tr>
      <tr>
          <td><strong>huge</strong></td>
          <td>&gt;64 KB</td>
          <td>&gt;64 KB (tablice &gt;64KB)</td>
          <td>Największy</td>
      </tr>
  </tbody>
</table>
<h4 id="rozmiar-wskaźników-i-tryb-adresowania">Rozmiar wskaźników i tryb adresowania</h4>
<h6 id="model-tinysmallcompact-near-code">Model TINY/SMALL/COMPACT (near code):</h6>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">CALL</span> <span class="no">procedura</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Generuje: <strong>E8 xx xx</strong> (3 bajty - relative near call)</p>
<ul>
<li>Offset względny 16-bit</li>
<li>Zakłada, że procedura jest w tym samym segmencie kodu</li>
</ul>
<h4 id="model-mediumlargehuge-far-code">Model MEDIUM/LARGE/HUGE (far code):</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">CALL</span> <span class="no">procedura</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Generuje: <strong>9A xx xx yy yy</strong> (5 bajtów - absolute far call)</p>
<ul>
<li>Pełny adres: offset (2 bajty) + segment (2 bajty)</li>
<li>Może wywołać procedurę w innym segmencie</li>
</ul>
<h3 id="stack-512"><code>.stack 512</code></h3>
<p>Rezerwuje <strong>512 bajtów</strong> na stos programu. Stos służy do:</p>
<ul>
<li>Przechowywania adresów powrotu z funkcji</li>
<li>Zmiennych lokalnych</li>
<li>Tymczasowego przechowywania rejestrów</li>
</ul>
<p><strong>Można zmienić rozmiar</strong>, np. <code>.stack 1024</code>.</p>
<h5 id="com">COM:</h5>
<ul>
<li>Dyrektywa jest IGNOROWANA</li>
<li>Program COM ma z góry ustalony stos na <strong>końcu dostępnej pamięci</strong></li>
<li>Rejestr SP wskazuje na koniec segmentu (offset FFFEh lub FFFFh)</li>
<li>Stos &ldquo;rośnie w dół&rdquo; od końca dostępnych 64KB</li>
<li>Nie ma kontroli nad wielkością stosu w pliku COM</li>
</ul>
<h5 id="exe-1">EXE:</h5>
<ul>
<li><strong>Dyrektywa tworzy osobny segment stosu</strong> o wielkości XXX bajtów</li>
<li>Linker umieszcza ten segment w pliku wykonywalnym</li>
<li>Rejestry SS:SP są inicjalizowane przez loader systemu operacyjnego</li>
<li>SP wskazuje na koniec zaalokowanego obszaru stosu (offset XXX)</li>
<li>Rozmiar stosu można precyzyjnie kontrolować</li>
</ul>
<h3 id="data"><code>.data</code></h3>
<p>Początek sekcji <strong>zainicjalizowanych danych</strong>. Tu deklarujemy zmienne z wartościami początkowymi.</p>
<h4 id="deklaracja-zmiennych">Deklaracja zmiennych</h4>
<table>
  <thead>
      <tr>
          <th>Dyrektywa</th>
          <th>Rozmiar</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>DB</strong></td>
          <td>1 bajt</td>
      </tr>
      <tr>
          <td><strong>DW</strong></td>
          <td>2 bajty (1 słowo)</td>
      </tr>
      <tr>
          <td><strong>DD</strong></td>
          <td>4 bajty (2 słowa)</td>
      </tr>
      <tr>
          <td><strong>DF</strong></td>
          <td>6 bajtów</td>
      </tr>
      <tr>
          <td><strong>DQ</strong></td>
          <td>8 bajtów</td>
      </tr>
      <tr>
          <td><strong>DT</strong></td>
          <td>10 bajtów</td>
      </tr>
  </tbody>
</table>
<p>Przykłady:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">Liczba</span>  <span class="no">dw</span> <span class="err">?</span>             <span class="c1">; 1 słowo, niezaincjalizowane
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">Liczby</span>  <span class="no">dw</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">2000</span>
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">.data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">liczba</span> <span class="no">dw</span> <span class="mi">100</span>
</span></span><span class="line"><span class="cl">    <span class="nf">tekst</span> <span class="no">db</span> <span class="err">&#34;</span><span class="no">Hello$</span><span class="err">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nf">tablica</span> <span class="no">db</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="data-1"><code>.data?</code></h3>
<p>Sekcja <strong>niezainicjalizowanych danych</strong> (opcjonalna). Zmienne bez wartości początkowej.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">.data</span><span class="err">?</span>
</span></span><span class="line"><span class="cl">    <span class="nf">bufor</span> <span class="no">db</span> <span class="mi">100</span> <span class="no">dup</span><span class="p">(</span><span class="err">?</span><span class="p">)</span>  <span class="c1">; 100 bajtów nieokreślonych
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="code"><code>.code</code></h3>
<p>Początek sekcji <strong>kodu programu</strong>.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">.code</span>
</span></span><span class="line"><span class="cl"><span class="nl">start:</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="err">@</span><span class="no">data</span>    <span class="c1">; inicjalizacja DS
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">ds</span><span class="p">,</span> <span class="no">ax</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">; właściwy kod...
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="mi">4</span><span class="no">C00h</span>    <span class="c1">; zakończenie
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="no">start</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong><code>end start</code></strong> - wskazuje punkt wejścia programu (etykietę <code>start</code>).</p>
<h3 id="szablon">Szablon</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">.model</span> <span class="no">small</span>  
</span></span><span class="line"><span class="cl"><span class="no">.stack</span> <span class="mi">1024</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">.data</span>
</span></span><span class="line"><span class="cl">    <span class="c1">; {dane}
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="na">.code</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">endp</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">; {kod}
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">endp</span>
</span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="no">main</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="7-rejestry-procesora">7. Rejestry procesora</h2>
<h3 id="rejestry-ogólnego-przeznaczenia-general-purpose-registers">Rejestry ogólnego przeznaczenia (General Purpose Registers)</h3>
<p>Procesory x86 w trybie 16-bitowym dysponują czterema głównymi rejestrami ogólnego przeznaczenia, z których każdy może być używany jako jeden rejestr 16-bitowy lub dwa oddzielne rejestry 8-bitowe.</p>
<table>
  <thead>
      <tr>
          <th>Rejestr</th>
          <th>Pełna nazwa</th>
          <th>Podział 8-bitowy</th>
          <th>Typowe zastosowanie</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>AX</strong></td>
          <td>Accumulator</td>
          <td>AH (high), AL (low)</td>
          <td>akumulator – operacje arytmetyczne, I/O, wynik funkcji</td>
      </tr>
      <tr>
          <td><strong>BX</strong></td>
          <td>Base</td>
          <td>BH, BL</td>
          <td>rejestr bazowy – adresowanie pamięci, wskaźnik tablic</td>
      </tr>
      <tr>
          <td><strong>CX</strong></td>
          <td>Counter</td>
          <td>CH, CL</td>
          <td>licznik – pętle, operacje stringowe, przesunięcia</td>
      </tr>
      <tr>
          <td><strong>DX</strong></td>
          <td>Data</td>
          <td>DH, DL</td>
          <td>dane – I/O portów, mnożenie/dzielenie (starsze bity)</td>
      </tr>
  </tbody>
</table>
<p><strong>Uwagi:</strong></p>
<ul>
<li>Rejestry te można używać wymiennie w większości operacji arytmetycznych i logicznych</li>
<li>Podział na części wysoką (H - high) i niską (L - low) pozwala na efektywną pracę z danymi 8-bitowymi</li>
<li>Niektóre instrukcje wymagają konkretnego rejestru (np. <code>mul</code> używa AX, <code>loop</code> sprawdza CX)</li>
</ul>
<h3 id="rejestry-wskaźnikowe-i-indeksowe-pointer-and-index-registers">Rejestry wskaźnikowe i indeksowe (Pointer and Index Registers)</h3>
<table>
  <thead>
      <tr>
          <th>Rejestr</th>
          <th>Pełna nazwa</th>
          <th>Zastosowanie</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>SP</strong></td>
          <td>Stack Pointer</td>
          <td>wskaźnik wierzchołka stosu – adresuje bieżący element na stosie</td>
      </tr>
      <tr>
          <td><strong>BP</strong></td>
          <td>Base Pointer</td>
          <td>wskaźnik bazowy ramki stosu – dostęp do parametrów i zmiennych lokalnych</td>
      </tr>
      <tr>
          <td><strong>SI</strong></td>
          <td>Source Index</td>
          <td>indeks źródłowy – operacje stringowe, adresowanie tablic</td>
      </tr>
      <tr>
          <td><strong>DI</strong></td>
          <td>Destination Index</td>
          <td>indeks docelowy – operacje stringowe, adresowanie tablic</td>
      </tr>
  </tbody>
</table>
<p><strong>Uwagi:</strong></p>
<ul>
<li><strong>SP</strong> automatycznie modyfikowany przez <code>push</code>, <code>pop</code>, <code>call</code>, <code>ret</code></li>
<li><strong>BP</strong> typowo używany do budowania ramek stosu w procedurach</li>
<li><strong>SI</strong> i <strong>DI</strong> pracują razem w instrukcjach stringowych (<code>movsb</code>, <code>cmpsb</code>, etc.)</li>
<li>Rejestry te nie mają podziału na części 8-bitowe</li>
</ul>
<h3 id="rejestry-segmentowe-segment-registers">Rejestry segmentowe (Segment Registers)</h3>
<p>W architekturze x86 adres fizyczny jest tworzony z pary: rejestr segmentowy + offset. Każdy segment może mieć maksymalnie 64KB (0000h-FFFFh).</p>
<table>
  <thead>
      <tr>
          <th>Rejestr</th>
          <th>Pełna nazwa</th>
          <th>Zastosowanie</th>
          <th>Domyślny offset</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>CS</strong></td>
          <td>Code Segment</td>
          <td>segment kodu – określa, gdzie znajduje się kod programu</td>
          <td>IP</td>
      </tr>
      <tr>
          <td><strong>DS</strong></td>
          <td>Data Segment</td>
          <td>segment danych – dostęp do zmiennych globalnych</td>
          <td>BX, SI, DI</td>
      </tr>
      <tr>
          <td><strong>SS</strong></td>
          <td>Stack Segment</td>
          <td>segment stosu – określa położenie stosu</td>
          <td>SP, BP</td>
      </tr>
      <tr>
          <td><strong>ES</strong></td>
          <td>Extra Segment</td>
          <td>dodatkowy segment – operacje stringowe, dodatkowe dane</td>
          <td>DI</td>
      </tr>
  </tbody>
</table>
<p><strong>Uwagi:</strong></p>
<ul>
<li>Adres fizyczny = Segment × 16 + Offset (np. CS:IP, DS:BX, SS:SP)</li>
<li>Rejestry segmentowe <strong>nie mogą być używane bezpośrednio</strong> w operacjach arytmetycznych</li>
<li>Zmiana CS możliwa tylko przez instrukcje skoku dalekiego (<code>jmp far</code>, <code>call far</code>, <code>retf</code>)</li>
<li>W małych modelach pamięci (.model small) często wszystkie segmenty wskazują na ten sam obszar</li>
</ul>
<h3 id="rejestr-wskaźnika-instrukcji-instruction-pointer">Rejestr wskaźnika instrukcji (Instruction Pointer)</h3>
<table>
  <thead>
      <tr>
          <th>Rejestr</th>
          <th>Pełna nazwa</th>
          <th>Zastosowanie</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>IP</strong></td>
          <td>Instruction Pointer</td>
          <td>wskaźnik następnej instrukcji do wykonania (w obrębie CS)</td>
      </tr>
      <tr>
          <td></td>
          <td></td>
          <td></td>
      </tr>
  </tbody>
</table>
<p><strong>Uwagi:</strong></p>
<ul>
<li><strong>Nie można bezpośrednio odczytać ani zapisać</strong> wartości IP</li>
<li>IP jest modyfikowany automatycznie przez procesor oraz instrukcje skoku i wywołań</li>
<li>Adres fizyczny następnej instrukcji: CS:IP</li>
<li>Do pośredniego dostępu można użyć <code>call</code> z natychmiastowym <code>pop</code></li>
</ul>
<h3 id="rejestr-flag-procesora-flags-register">Rejestr flag procesora (Flags Register)</h3>
<p><strong>Rejestr flag</strong> to specjalny 16-bitowy rejestr zawierający bity informacyjne o wyniku ostatniej operacji oraz kontrolujące tryb pracy procesora.</p>
<table>
  <thead>
      <tr>
          <th>Flaga</th>
          <th>Nazwa</th>
          <th>Bit</th>
          <th>Znaczenie</th>
          <th>Kiedy się ustawia (przykłady)</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>CF</strong></td>
          <td>Carry Flag</td>
          <td>0</td>
          <td>przeniesienie/pożyczka przy operacjach bez znaku (unsigned)</td>
          <td>wynik dodawania przekracza 8/16 bitów; przy odejmowaniu pożyczka (np. <code>sub ax,bx</code>)</td>
      </tr>
      <tr>
          <td><strong>PF</strong></td>
          <td>Parity Flag</td>
          <td>2</td>
          <td>parzystość najmłodszego bajtu wyniku</td>
          <td>jeśli najmłodszy bajt ma parzystą liczbę bitów = 1</td>
      </tr>
      <tr>
          <td><strong>AF</strong></td>
          <td>Adjust Flag (Aux Carry)</td>
          <td>4</td>
          <td>przeniesienie/pożyczka między bitami 3 i 4 (BCD)</td>
          <td>używane głównie przy arytmetyce BCD (<code>daa</code>, <code>das</code>)</td>
      </tr>
      <tr>
          <td><strong>ZF</strong></td>
          <td>Zero Flag</td>
          <td>6</td>
          <td>wynik operacji = 0</td>
          <td>każda instrukcja arytmetyczna/logiczna, której wynik daje zero</td>
      </tr>
      <tr>
          <td><strong>SF</strong></td>
          <td>Sign Flag</td>
          <td>7</td>
          <td>znak wyniku – kopia najbardziej znaczącego bitu (MSB)</td>
          <td>wynik ma ustawiony bit najwyższego rzędu (wynik traktowany jako ujemny – signed)</td>
      </tr>
      <tr>
          <td><strong>TF</strong></td>
          <td>Trap Flag</td>
          <td>8</td>
          <td>tryb krokowy (single-step)</td>
          <td>po ustawieniu powstaje przerwanie po każdej instrukcji (debugowanie)</td>
      </tr>
      <tr>
          <td><strong>IF</strong></td>
          <td>Interrupt Flag</td>
          <td>9</td>
          <td>włączenie przerwań maskowalnych</td>
          <td><code>sti</code> – włącza, <code>cli</code> – wyłącza przerwania maskowalne</td>
      </tr>
      <tr>
          <td><strong>DF</strong></td>
          <td>Direction Flag</td>
          <td>10</td>
          <td>kierunek operacji stringowych</td>
          <td>0 = inkrementacja (domyślnie), 1 = dekrementacja (<code>std</code> ustawia, <code>cld</code> czyści)</td>
      </tr>
      <tr>
          <td><strong>OF</strong></td>
          <td>Overflow Flag</td>
          <td>11</td>
          <td>przepełnienie dla wartości ze znakiem (signed)</td>
          <td>wynik arytmetyczny wykracza poza zakres signed (np. +32767 + 1 → -32768)</td>
      </tr>
  </tbody>
</table>
<p><strong>Uwagi:</strong></p>
<ul>
<li>Flagi CF, PF, AF, ZF, SF, OF – <strong>flagi stanu</strong> (modyfikowane przez operacje arytmetyczne/logiczne)</li>
<li>Flagi TF, IF, DF – <strong>flagi kontrolne</strong> (kontrolują tryb pracy procesora)</li>
<li>Dostęp do rejestru flag: <code>pushf</code> (odłóż na stos), <code>popf</code> (zdejmij ze stosu)</li>
<li>Instrukcje warunkowe (<code>jz</code>, <code>jc</code>, <code>jg</code>, etc.) sprawdzają kombinacje flag</li>
<li>Bity 1, 3, 5, 12-15 są <strong>zarezerwowane</strong> (zawsze = 0 w 8086/80286)</li>
</ul>
<h2 id="8-podstawowe-instrukcje-asemblera">8. Podstawowe instrukcje asemblera</h2>
<h3 id="przesyłanie-danych">Przesyłanie danych</h3>
<table>
  <thead>
      <tr>
          <th>Instrukcja</th>
          <th>Opis</th>
          <th>Przykład</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>MOV dest, src</strong></td>
          <td>Kopiuj src - dest</td>
          <td><code>mov ax, 5</code></td>
      </tr>
      <tr>
          <td><strong>XCHG a, b</strong></td>
          <td>Zamień miejscami</td>
          <td><code>xchg ax, bx</code></td>
      </tr>
      <tr>
          <td><strong>LEA reg, mem</strong></td>
          <td>Załaduj adres</td>
          <td><code>lea dx, tekst</code></td>
      </tr>
  </tbody>
</table>
<blockquote>
<p><strong>Uwaga:</strong> Nie można wykonać <code>mov mem, mem</code> - tylko przez rejestr!</p>
</blockquote>
<p><strong>Ustawianie rejestrów:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">02</span><span class="no">h</span>    <span class="c1">; do AH ładowana jest liczba 02h
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">dl</span><span class="p">,</span> <span class="mi">07</span><span class="no">h</span>    <span class="c1">; do DL ładowana jest liczba 07h
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="arytmetyka">Arytmetyka</h3>
<table>
  <thead>
      <tr>
          <th>Instrukcja</th>
          <th>Opis</th>
          <th>Flagi</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>ADD dest, src</strong></td>
          <td>dest = dest + src</td>
          <td>ZF, CF, OF</td>
      </tr>
      <tr>
          <td><strong>SUB dest, src</strong></td>
          <td>dest = dest - src</td>
          <td>ZF, CF, OF</td>
      </tr>
      <tr>
          <td><strong>INC dest</strong></td>
          <td>dest = dest + 1</td>
          <td>ZF, OF</td>
      </tr>
      <tr>
          <td><strong>DEC dest</strong></td>
          <td>dest = dest - 1</td>
          <td>ZF, OF</td>
      </tr>
      <tr>
          <td><strong>MUL src</strong></td>
          <td>AX = AL × src (8-bit)<br>DX:AX = AX × src (16-bit)</td>
          <td>CF, OF</td>
      </tr>
      <tr>
          <td><strong>DIV src</strong></td>
          <td>AL = AX ÷ src, AH = reszta (8-bit)<br>AX = DX:AX ÷ src, DX = reszta (16-bit)</td>
          <td>-</td>
      </tr>
  </tbody>
</table>
<p><strong>Przykład:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="mi">255</span>
</span></span><span class="line"><span class="cl"><span class="nf">inc</span> <span class="no">al</span>        <span class="c1">; AL = 0, ZF = 1, CF = 1
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="logika">Logika</h3>
<table>
  <thead>
      <tr>
          <th>Instrukcja</th>
          <th>Opis</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>AND dest, src</strong></td>
          <td>Iloczyn logiczny</td>
      </tr>
      <tr>
          <td><strong>OR dest, src</strong></td>
          <td>Suma logiczna</td>
      </tr>
      <tr>
          <td><strong>XOR dest, src</strong></td>
          <td>Alternatywa rozłączna (exclusive or)</td>
      </tr>
      <tr>
          <td><strong>NOT dest</strong></td>
          <td>Negacja bitowa</td>
      </tr>
      <tr>
          <td><strong>TEST a, b</strong></td>
          <td>AND bez zapisywania (tylko flagi)</td>
      </tr>
  </tbody>
</table>
<h3 id="przesunięcia">Przesunięcia</h3>
<table>
  <thead>
      <tr>
          <th>Instrukcja</th>
          <th>Opis</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>SHL dest, count</strong></td>
          <td>Shift left (× 2)</td>
      </tr>
      <tr>
          <td><strong>SHR dest, count</strong></td>
          <td>Shift right (÷ 2)</td>
      </tr>
      <tr>
          <td><strong>ROL dest, count</strong></td>
          <td>Rotate left</td>
      </tr>
      <tr>
          <td><strong>ROR dest, count</strong></td>
          <td>Rotate right</td>
      </tr>
  </tbody>
</table>
<p><strong>Przykład:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">cl</span><span class="p">,</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl"><span class="nf">shl</span> <span class="no">ax</span><span class="p">,</span> <span class="no">cl</span>    <span class="c1">; AX = AX × 8
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="porównania-i-skoki">Porównania i skoki</h3>
<p><strong>Etykieta:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nl">start:</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Skok bezwarunkowy:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">jmp</span> <span class="no">etykieta</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Instrukcje porównania</strong></p>
<table>
  <thead>
      <tr>
          <th>Instrukcja</th>
          <th>Opis działania</th>
          <th>Wpływ na flagi</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>CMP r/m, r/m/imm</strong></td>
          <td>odejmuje: <code>lhs - rhs</code>, ale <strong>nie zapisuje wyniku</strong></td>
          <td><strong>ZF, SF, CF, OF, PF, AF</strong> ustawiane na podstawie wyniku odejmowania</td>
      </tr>
      <tr>
          <td><strong>TEST r/m, r/m/imm</strong></td>
          <td>AND bitowy, wynik nie jest zapisywany</td>
          <td><strong>ZF, SF, PF</strong>; CF i OF <strong>zawsze = 0</strong>; AF nieokreślone</td>
      </tr>
  </tbody>
</table>
<table>
  <thead>
      <tr>
          <th></th>
          <th><strong>CMP</strong></th>
          <th><strong>TEST</strong></th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Działanie</td>
          <td>wykonuje <code>lhs - rhs</code> (odejmowanie)</td>
          <td>wykonuje <code>lhs AND rhs</code></td>
      </tr>
      <tr>
          <td>Wynik zapisany</td>
          <td>nie</td>
          <td>nie</td>
      </tr>
      <tr>
          <td>Porównanie typów</td>
          <td><strong>signed i unsigned</strong></td>
          <td>zależności bitowe, maski, sprawdzenia pojedynczych bitów</td>
      </tr>
      <tr>
          <td>Typowe zastosowania</td>
          <td>porównania liczb, warunki &gt;,&lt;,=</td>
          <td>sprawdzanie bitów, flag, testowanie pojedynczych właściwości</td>
      </tr>
  </tbody>
</table>
<p><strong>Instrukcje skoku (warunkowe)</strong></p>
<table>
  <thead>
      <tr>
          <th>Instrukcja</th>
          <th>Warunek (flagi)</th>
          <th>Znaczenie</th>
          <th></th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>JE / JZ a</strong></td>
          <td>ZF = 1</td>
          <td>równe</td>
          <td>op1 == op2</td>
      </tr>
      <tr>
          <td><strong>JNE / JNZ a</strong></td>
          <td>ZF = 0</td>
          <td>różne</td>
          <td>op1 != op2</td>
      </tr>
      <tr>
          <td><strong>JC a</strong></td>
          <td>CF = 1</td>
          <td>carry = 1</td>
          <td></td>
      </tr>
      <tr>
          <td><strong>JNC a</strong></td>
          <td>CF = 0</td>
          <td>carry = 0</td>
          <td></td>
      </tr>
      <tr>
          <td><strong>JS a</strong></td>
          <td>SF = 1</td>
          <td>wynik ujemny (sign)</td>
          <td></td>
      </tr>
      <tr>
          <td><strong>JNS a</strong></td>
          <td>SF = 0</td>
          <td>wynik dodatni/zero</td>
          <td></td>
      </tr>
      <tr>
          <td><strong>JO a</strong></td>
          <td>OF = 1</td>
          <td>overflow</td>
          <td></td>
      </tr>
      <tr>
          <td><strong>JNO a</strong></td>
          <td>OF = 0</td>
          <td>brak overflow</td>
          <td></td>
      </tr>
      <tr>
          <td><strong>JP / JPE a</strong></td>
          <td>PF = 1</td>
          <td>parzystość</td>
          <td></td>
      </tr>
      <tr>
          <td><strong>JNP / JPO a</strong></td>
          <td>PF = 0</td>
          <td>nieparzystość</td>
          <td></td>
      </tr>
  </tbody>
</table>
<p><strong>BEZ ZNAKU</strong> (unsigned)</p>
<table>
  <thead>
      <tr>
          <th>Instrukcja</th>
          <th>Warunek</th>
          <th>Znaczenie</th>
          <th></th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>JA a</strong></td>
          <td>(CF = 0) AND (ZF = 0)</td>
          <td>większe (unsigned)</td>
          <td>op1 &gt; op2</td>
      </tr>
      <tr>
          <td><strong>JAE / JNC a</strong></td>
          <td>CF = 0</td>
          <td>większe lub równe (unsigned)</td>
          <td>op1 &gt;= op2</td>
      </tr>
      <tr>
          <td><strong>JB / JC a</strong></td>
          <td>CF = 1</td>
          <td>mniejsze (unsigned)</td>
          <td>op1 &lt;  op2</td>
      </tr>
      <tr>
          <td><strong>JBE a</strong></td>
          <td>(CF = 1) OR (ZF = 1)</td>
          <td>mniejsze lub równe (unsigned)</td>
          <td>op1 &lt;= op2</td>
      </tr>
  </tbody>
</table>
<p><strong>ZE ZNAKIEM</strong> (signed)</p>
<table>
  <thead>
      <tr>
          <th>Instrukcja</th>
          <th>Warunek</th>
          <th>Znaczenie</th>
          <th></th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>JG a</strong></td>
          <td>(ZF = 0) AND (SF = OF)</td>
          <td>większe (signed)</td>
          <td>op1 &gt; op2</td>
      </tr>
      <tr>
          <td><strong>JGE a</strong></td>
          <td>SF = OF</td>
          <td>większe lub równe (signed)</td>
          <td>op1 &gt;= op2</td>
      </tr>
      <tr>
          <td><strong>JL a</strong></td>
          <td>SF ≠ OF</td>
          <td>mniejsze (signed)</td>
          <td>op1 &lt; op2</td>
      </tr>
      <tr>
          <td><strong>JLE a</strong></td>
          <td>(ZF = 1) OR (SF ≠ OF)</td>
          <td>mniejsze lub równe (signed)</td>
          <td>op1 &lt;= op2</td>
      </tr>
  </tbody>
</table>
<h3 id="pętle">Pętle</h3>
<table>
  <thead>
      <tr>
          <th>Instrukcja</th>
          <th>Opis</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>LOOP label</strong></td>
          <td>CX&ndash;, jeśli CX ≠ 0 skocz</td>
      </tr>
  </tbody>
</table>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">cx</span><span class="p">,</span> <span class="mi">10</span>
</span></span><span class="line"><span class="cl"><span class="nl">petla:</span>
</span></span><span class="line"><span class="cl">    <span class="c1">; kod powtarzany 10 razy
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">loop</span> <span class="no">petla</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="stos">Stos</h3>
<table>
  <thead>
      <tr>
          <th>Instrukcja</th>
          <th>Opis</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>PUSH src</strong></td>
          <td>Włóż na stos</td>
      </tr>
      <tr>
          <td><strong>POP dest</strong></td>
          <td>Zdejmij ze stosu</td>
      </tr>
      <tr>
          <td><strong>PUSHF</strong></td>
          <td>Włóż flagi</td>
      </tr>
      <tr>
          <td><strong>POPF</strong></td>
          <td>Zdejmij flagi</td>
      </tr>
  </tbody>
</table>
<h3 id="procedury">Procedury</h3>
<table>
  <thead>
      <tr>
          <th>Instrukcja</th>
          <th>Opis</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>CALL proc</strong></td>
          <td>Wywołaj procedurę</td>
      </tr>
      <tr>
          <td><strong>RET</strong></td>
          <td>Powrót z procedury</td>
      </tr>
  </tbody>
</table>
<h2 id="9-czym-jest-przerwanie-interrupt">9. Czym jest przerwanie (interrupt)?</h2>
<p><strong>Przerwanie</strong> to mechanizm komunikacji między programem a systemem operacyjnym lub BIOS-em.</p>
<h3 id="jak-to-działa">Jak to działa?</h3>
<ol>
<li>Program umieszcza parametry w rejestrach</li>
<li>Wywołuje instrukcję <code>INT &lt;numer&gt;</code></li>
<li>Procesor:
<ul>
<li>Zapisuje aktualny stan na stosie</li>
<li>Skacze do procedury obsługi przerwania</li>
<li>Po zakończeniu wraca do programu</li>
</ul>
</li>
</ol>
<h3 id="przykład-wyświetlenie-znaku">Przykład: wyświetlenie znaku</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">02</span><span class="no">h</span>      <span class="c1">; funkcja 02h - wypisz znak
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">dl</span><span class="p">,</span> <span class="err">&#39;</span><span class="no">A</span><span class="err">&#39;</span>      <span class="c1">; znak do wyświetlenia
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>          <span class="c1">; wywołaj DOS
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="tabela-przykładowych-funkcji-przerwania-dos-int-21h">Tabela przykładowych funkcji przerwania DOS (INT 21h)</h3>
<p><strong>INT 21h</strong> to główne przerwanie DOS-u do obsługi I/O, plików i systemu.</p>
<table>
  <thead>
      <tr>
          <th>Funkcja (AH)</th>
          <th>Opis</th>
          <th>Parametry wejściowe</th>
          <th>Wynik</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>01h</strong></td>
          <td>Czytaj znak z echo</td>
          <td>-</td>
          <td>AL = znak</td>
      </tr>
      <tr>
          <td><strong>02h</strong></td>
          <td>Wypisz znak</td>
          <td>DL = znak</td>
          <td>-</td>
      </tr>
      <tr>
          <td><strong>08h</strong></td>
          <td>Czytaj znak bez echo</td>
          <td>-</td>
          <td>AL = znak</td>
      </tr>
      <tr>
          <td><strong>09h</strong></td>
          <td>Wypisz string</td>
          <td>DS:DX = adres (kończy $)</td>
          <td>-</td>
      </tr>
      <tr>
          <td><strong>0Ah</strong></td>
          <td>Buforowany input</td>
          <td>DS:DX = bufor</td>
          <td>-</td>
      </tr>
      <tr>
          <td><strong>3Ch</strong></td>
          <td>Utwórz plik</td>
          <td>DS:DX = nazwa, CX = atrybuty</td>
          <td>AX = uchwyt / błąd</td>
      </tr>
      <tr>
          <td><strong>3Dh</strong></td>
          <td>Otwórz plik</td>
          <td>DS:DX = nazwa, AL = tryb</td>
          <td>AX = uchwyt / błąd</td>
      </tr>
      <tr>
          <td><strong>3Eh</strong></td>
          <td>Zamknij plik</td>
          <td>BX = uchwyt</td>
          <td>-</td>
      </tr>
      <tr>
          <td><strong>40h</strong></td>
          <td>Zapisz do pliku</td>
          <td>BX = uchwyt, DS:DX = dane, CX = długość</td>
          <td>AX = zapisane bajty</td>
      </tr>
      <tr>
          <td><strong>3Fh</strong></td>
          <td>Czytaj z pliku</td>
          <td>BX = uchwyt, DS:DX = bufor, CX = długość</td>
          <td>AX = przeczytane bajty</td>
      </tr>
      <tr>
          <td><strong>42h</strong></td>
          <td>Przesuń wskaźnik</td>
          <td>BX = uchwyt, CX:DX = pozycja, AL = tryb</td>
          <td>DX:AX = nowa pozycja</td>
      </tr>
      <tr>
          <td><strong>4Ch</strong></td>
          <td>Zakończ program</td>
          <td>AL = kod powrotu</td>
          <td>-</td>
      </tr>
      <tr>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
      </tr>
  </tbody>
</table>
<p><strong>Tryb otwarcia pliku (funkcja 3Dh, rejestr AL):</strong></p>
<ul>
<li>00h = tylko odczyt</li>
<li>01h = tylko zapis</li>
<li>02h = odczyt/zapis</li>
</ul>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">02</span><span class="no">h</span>
</span></span><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">dl</span><span class="p">,</span> <span class="mi">07</span><span class="no">h</span>
</span></span><span class="line"><span class="cl"><span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>wywołuje funkcję <code>02h</code> przerwania <code>21h</code>, która wysyła znak <code>07h</code> (BEL / dzwonek).</p>
<h3 id="tabela-funkcji-int-10h-dla-trybu-tekstowego">Tabela funkcji INT 10h dla trybu tekstowego</h3>
<table>
  <thead>
      <tr>
          <th>AH</th>
          <th>Funkcja</th>
          <th>Parametry wejściowe</th>
          <th>Parametry wyjściowe</th>
          <th>Opis</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>00h</strong></td>
          <td>Set Video Mode</td>
          <td>AL = tryb wideo<br>(03h = 80x25 tekst kolorowy)</td>
          <td>-</td>
          <td>Ustawia tryb pracy karty graficznej</td>
      </tr>
      <tr>
          <td><strong>01h</strong></td>
          <td>Set Cursor Shape</td>
          <td>CH = linia początkowa<br>CL = linia końcowa</td>
          <td>-</td>
          <td>Zmienia wygląd kursora (rozmiar, widoczność)</td>
      </tr>
      <tr>
          <td><strong>02h</strong></td>
          <td>Set Cursor Position</td>
          <td>BH = strona<br>DH = wiersz (0-24)<br>DL = kolumna (0-79)</td>
          <td>-</td>
          <td>Ustawia pozycję kursora na ekranie</td>
      </tr>
      <tr>
          <td><strong>03h</strong></td>
          <td>Get Cursor Position</td>
          <td>BH = strona</td>
          <td>CH = kształt początek<br>CL = kształt koniec<br>DH = wiersz<br>DL = kolumna</td>
          <td>Odczytuje pozycję i kształt kursora</td>
      </tr>
      <tr>
          <td><strong>05h</strong></td>
          <td>Select Active Page</td>
          <td>AL = numer strony (0-7)</td>
          <td>-</td>
          <td>Przełącza aktywną stronę ekranu</td>
      </tr>
      <tr>
          <td><strong>06h</strong></td>
          <td>Scroll Window Up</td>
          <td>AL = liczba linii (0=wyczyść)<br>BH = atrybut<br>CH,CL = lewy górny róg<br>DH,DL = prawy dolny róg</td>
          <td>-</td>
          <td>Przewija okno w górę lub czyści ekran</td>
      </tr>
      <tr>
          <td><strong>07h</strong></td>
          <td>Scroll Window Down</td>
          <td>AL = liczba linii<br>BH = atrybut<br>CH,CL = lewy górny róg<br>DH,DL = prawy dolny róg</td>
          <td>-</td>
          <td>Przewija okno w dół</td>
      </tr>
      <tr>
          <td><strong>08h</strong></td>
          <td>Read Character and Attribute</td>
          <td>BH = strona</td>
          <td>AH = atrybut<br>AL = znak</td>
          <td>Odczytuje znak i jego atrybut z pozycji kursora</td>
      </tr>
      <tr>
          <td><strong>09h</strong></td>
          <td>Write Character and Attribute</td>
          <td>AL = znak<br>BH = strona<br>BL = atrybut<br>CX = liczba powtórzeń</td>
          <td>-</td>
          <td>Wyświetla znak z atrybutem (kursor się nie przesuwa)</td>
      </tr>
      <tr>
          <td><strong>0Ah</strong></td>
          <td>Write Character Only</td>
          <td>AL = znak<br>BH = strona<br>CX = liczba powtórzeń</td>
          <td>-</td>
          <td>Wyświetla znak bez zmiany atrybutu</td>
      </tr>
      <tr>
          <td><strong>0Eh</strong></td>
          <td>Teletype Output</td>
          <td>AL = znak<br>BH = strona<br>BL = kolor (tryb graficzny)</td>
          <td>-</td>
          <td>Wyświetla znak jak terminal (z obsługą \n, \r, \b)</td>
      </tr>
      <tr>
          <td><strong>0Fh</strong></td>
          <td>Get Video Mode</td>
          <td>-</td>
          <td>AH = liczba kolumn<br>AL = tryb wideo<br>BH = aktywna strona</td>
          <td>Pobiera informacje o aktualnym trybie</td>
      </tr>
      <tr>
          <td><strong>13h</strong></td>
          <td>Write String</td>
          <td>AL = tryb zapisu<br>BH = strona<br>BL = atrybut<br>CX = długość<br>DH,DL = pozycja<br>ES:BP = adres tekstu</td>
          <td>-</td>
          <td>Wyświetla cały ciąg znaków</td>
      </tr>
  </tbody>
</table>
<h3 id="kody-atrybutów-kolorów-dla-bhbl">Kody atrybutów kolorów (dla BH/BL)</h3>
<h4 id="format-bajtu-atrybutu-kbbbtttt">Format bajtu atrybutu: <code>KBBBTTTT</code></h4>
<ul>
<li><strong>K</strong> - miganie (1 bit)</li>
<li><strong>BBB</strong> - kolor tła (3 bity)</li>
<li><strong>TTTT</strong> - kolor tekstu (4 bity)</li>
</ul>
<h4 id="kolory-0-15">Kolory (0-15):</h4>
<table>
  <thead>
      <tr>
          <th>Wartość</th>
          <th>Kolor</th>
          <th>Wartość</th>
          <th>Kolor</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>0</td>
          <td>Czarny</td>
          <td>8</td>
          <td>Ciemnoszary</td>
      </tr>
      <tr>
          <td>1</td>
          <td>Niebieski</td>
          <td>9</td>
          <td>Jasnoniebieski</td>
      </tr>
      <tr>
          <td>2</td>
          <td>Zielony</td>
          <td>A</td>
          <td>Jasnozielony</td>
      </tr>
      <tr>
          <td>3</td>
          <td>Cyjan</td>
          <td>B</td>
          <td>Jasny cyjan</td>
      </tr>
      <tr>
          <td>4</td>
          <td>Czerwony</td>
          <td>C</td>
          <td>Jasnoczerwony</td>
      </tr>
      <tr>
          <td>5</td>
          <td>Magenta</td>
          <td>D</td>
          <td>Jasna magenta</td>
      </tr>
      <tr>
          <td>6</td>
          <td>Brązowy</td>
          <td>E</td>
          <td>Żółty</td>
      </tr>
      <tr>
          <td>7</td>
          <td>Jasnoszary</td>
          <td>F</td>
          <td>Biały</td>
      </tr>
  </tbody>
</table>
<h3 id="przykłady-użycia">Przykłady użycia:</h3>
<h4 id="przykład-1-czyszczenie-ekranu">Przykład 1: Czyszczenie ekranu</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">06</span><span class="no">h</span>      <span class="c1">; Scroll up
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="mi">0</span>        <span class="c1">; Cały ekran
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">bh</span><span class="p">,</span> <span class="mi">07</span><span class="no">h</span>      <span class="c1">; Atrybut: białe na czarnym
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">cx</span><span class="p">,</span> <span class="mi">0</span>        <span class="c1">; Lewy górny (0,0)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">dx</span><span class="p">,</span> <span class="mi">184</span><span class="no">Fh</span>    <span class="c1">; Prawy dolny (24,79)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">int</span> <span class="mi">10</span><span class="no">h</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="przykład-2-wyświetlanie-kolorowego-tekstu">Przykład 2: Wyświetlanie kolorowego tekstu</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">02</span><span class="no">h</span>      <span class="c1">; Ustaw kursor
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">bh</span><span class="p">,</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">dh</span><span class="p">,</span> <span class="mi">10</span>       <span class="c1">; Wiersz
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">dl</span><span class="p">,</span> <span class="mi">20</span>       <span class="c1">; Kolumna
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">int</span> <span class="mi">10</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">09</span><span class="no">h</span>      <span class="c1">; Wyświetl znak z atrybutem
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="no">A</span><span class="err">&#39;</span>      <span class="c1">; Znak
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">bh</span><span class="p">,</span> <span class="mi">0</span>        <span class="c1">; Strona
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">bl</span><span class="p">,</span> <span class="mi">1</span><span class="no">Eh</span>      <span class="c1">; Żółty na niebieskim (tło=1, tekst=E)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">cx</span><span class="p">,</span> <span class="mi">5</span>        <span class="c1">; Powtórz 5 razy
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">int</span> <span class="mi">10</span><span class="no">h</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="przykład-3-wyświetlanie-tekstu-funkcją-teletype">Przykład 3: Wyświetlanie tekstu funkcją teletype</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">0</span><span class="no">Eh</span>      <span class="c1">; Teletype
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="no">H</span><span class="err">&#39;</span>      <span class="c1">; Znak
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">bh</span><span class="p">,</span> <span class="mi">0</span>        <span class="c1">; Strona
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">int</span> <span class="mi">10</span><span class="no">h</span>          <span class="c1">; Wyświetl &#39;H&#39;
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="no">i</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nf">int</span> <span class="mi">10</span><span class="no">h</span>          <span class="c1">; Wyświetl &#39;i&#39;
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="p">!</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nf">int</span> <span class="mi">10</span><span class="no">h</span>          <span class="c1">; Wyświetl &#39;!&#39;
</span></span></span></code></pre></td></tr></table>
</div>
</div><h4 id="przykład-4-ukrywanie-kursora">Przykład 4: Ukrywanie kursora</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">01</span><span class="no">h</span>      <span class="c1">; Set cursor shape
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">ch</span><span class="p">,</span> <span class="mi">20</span><span class="no">h</span>      <span class="c1">; Bit 5 = 1 ukrywa kursor
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">cl</span><span class="p">,</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="nf">int</span> <span class="mi">10</span><span class="no">h</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="przykład-5-wyświetlanie-całego-ciągu">Przykład 5: Wyświetlanie całego ciągu</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">.DATA</span>
</span></span><span class="line"><span class="cl">    <span class="nf">tekst</span> <span class="no">DB</span> <span class="err">&#39;</span><span class="no">Hello</span> <span class="no">World</span><span class="p">!</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl">    <span class="nf">dlugosc</span> <span class="no">EQU</span> <span class="no">$-tekst</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">.CODE</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">13</span><span class="no">h</span>      <span class="c1">; Write string
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="mi">1</span>        <span class="c1">; Tryb 1: przesuwaj kursor, użyj BL
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">bh</span><span class="p">,</span> <span class="mi">0</span>        <span class="c1">; Strona
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">bl</span><span class="p">,</span> <span class="mi">0</span><span class="no">Eh</span>      <span class="c1">; Żółty na czarnym
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">cx</span><span class="p">,</span> <span class="no">dlugosc</span>  <span class="c1">; Długość
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">dh</span><span class="p">,</span> <span class="mi">12</span>       <span class="c1">; Wiersz
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">dl</span><span class="p">,</span> <span class="mi">35</span>       <span class="c1">; Kolumna
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">push</span> <span class="no">ds</span>
</span></span><span class="line"><span class="cl">    <span class="nf">pop</span> <span class="no">es</span>
</span></span><span class="line"><span class="cl">    <span class="nf">lea</span> <span class="no">bp</span><span class="p">,</span> <span class="no">tekst</span>    <span class="c1">; ES:BP wskazuje na tekst
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">int</span> <span class="mi">10</span><span class="no">h</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="11-wskazówki">11. Wskazówki</h2>
<ol>
<li>
<p><strong>Zawsze inicjalizuj DS</strong> na początku programu:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="err">@</span><span class="no">data</span>
</span></span><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">ds</span><span class="p">,</span> <span class="no">ax</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>Zawsze kończ programem prawidłowo:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="mi">4</span><span class="no">C00h</span>
</span></span><span class="line"><span class="cl"><span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>Nie można kopiować pamięć-pamięć</strong> bezpośrednio:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="c1">; ŹLE:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="p">[</span><span class="no">zmienna1</span><span class="p">],</span> <span class="p">[</span><span class="no">zmienna2</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">; DOBRZE:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="p">[</span><span class="no">zmienna2</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nf">mov</span> <span class="p">[</span><span class="no">zmienna1</span><span class="p">],</span> <span class="no">ax</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>Rozmiary muszą się zgadzać:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="c1">; ŹLE:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="no">word</span> <span class="no">ptr</span> <span class="p">[</span><span class="no">zmienna</span><span class="p">]</span>  <span class="c1">; AL to 8-bit, word to 16-bit
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">; DOBRZE:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="no">word</span> <span class="no">ptr</span> <span class="p">[</span><span class="no">zmienna</span><span class="p">]</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>String musi kończyć się znakiem $</strong> dla funkcji 09h:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">tekst</span> <span class="no">db</span> <span class="err">&#34;</span><span class="no">String</span> <span class="no">musi</span> <span class="no">kończyć</span> <span class="no">się</span> <span class="no">znakiem</span> <span class="no">$</span><span class="err">&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
</ol>
<h2 id="materiały-dodatkowe---sporo-staroci">Materiały dodatkowe - sporo staroci</h2>
<h3 id="dokumentacja-techniczna">Dokumentacja techniczna</h3>
<ul>
<li><strong>Intel 8086 Family User&rsquo;s Manual</strong> - oficjalna dokumentacja procesora <a href="https://bitsavers.org/components/intel/8086/9800722-03_The_8086_Family_Users_Manual_Oct79.pdf">9800722-03_The_8086_Family_Users_Manual_Oct79.pdf</a></li>
<li><strong>MASM 6.1 Programmer&rsquo;s Guide</strong> - dokumentacja asemblera Microsoft <a href="http://www.bitsavers.org/pdf/microsoft/masm/Microsoft_MASM_6.0_1991/Microsoft_Macro_Assembler_6.0_Programmers_Guide_1991.pdf">Microsoft_Macro_Assembler_6.0_Programmers_Guide_1991.pdf</a></li>
<li><strong>Art of Assembly Language (16-bit)</strong> - Randall Hyde: <a href="https://www.plantation-productions.com/Webster/www.artofasm.com/DOS/index.html">https://www.plantation-productions.com/Webster/www.artofasm.com/DOS/index.html</a></li>
<li><strong>PC Assembly Language</strong> - Paul A. Carter (darmowy PDF) <a href="https://pacman128.github.io/static/pcasm-book.pdf">pcasm-book.pdf</a></li>
<li><strong>x86 Opcode and Instruction Reference</strong> - <a href="http://ref.x86asm.net/">http://ref.x86asm.net/</a></li>
</ul>
<h3 id="tutoriale-i-kursy-online">Tutoriale i kursy online</h3>
<ul>
<li><strong>Tutorials Point - Assembly Programming</strong>: <a href="https://www.tutorialspoint.com/assembly_programming/">https://www.tutorialspoint.com/assembly_programming/</a></li>
<li><strong>x86 Assembly Guide (University of Virginia)</strong>: <a href="https://www.cs.virginia.edu/~evans/cs216/guides/x86.html">https://www.cs.virginia.edu/~evans/cs216/guides/x86.html</a></li>
<li><strong>Assembly Language Tutorial (Derek Banas)</strong>: seria video na YouTube  (ARM)  <a href="https://www.youtube.com/watch?v=ViNnfoE56V8">Assembly Language Tutorial - YouTube</a></li>
</ul>
<h3 id="narzędzia-i-środowiska">Narzędzia i środowiska</h3>
<ul>
<li><strong>DOSBox</strong> - emulator DOS: <a href="https://www.dosbox.com/">https://www.dosbox.com/</a></li>
<li><strong>MASM/TASM</strong> - asemblery dla DOS</li>
<li><strong>Turbo Debugger</strong> - debugger dla programów DOS</li>
<li><strong>NASM</strong> - alternatywny assembler: <a href="https://www.nasm.us/">https://www.nasm.us/</a></li>
<li><strong>WinASM</strong> - IDE dla programowania w assemblerze</li>
</ul>
<h3 id="referencje-online">Referencje online</h3>
<ul>
<li><strong>OSDev Wiki</strong> - niskopoziomowe programowanie: <a href="https://wiki.osdev.org/">https://wiki.osdev.org/</a></li>
<li><strong>Felix Cloutier&rsquo;s x86 Reference</strong>: <a href="https://www.felixcloutier.com/x86/">https://www.felixcloutier.com/x86/</a></li>
<li><strong>Sandpile.org</strong> - szczegółowe informacje o architekturach x86</li>
</ul>
<h3 id="tryb-graficzny-mode-13h">Tryb graficzny (Mode 13h)</h3>
<ul>
<li><strong>Michael Abrash&rsquo;s Graphics Programming Black Book</strong> - klasyka grafiki VGA</li>
<li><strong>VGA Hardware Programming</strong>: <a href="http://www.osdever.net/FreeVGA/home.htm">http://www.osdever.net/FreeVGA/home.htm</a></li>
<li><strong>Mode 13h Tutorial</strong> - liczne tutoriale na YouTube i blogach</li>
</ul>
<h3 id="przerwania-dos-i-bios">Przerwania DOS i BIOS</h3>
<ul>
<li><strong>DOS API Reference</strong> - lista funkcji int 21h</li>
<li><strong>BIOS Services Reference</strong> - funkcje int 10h, 16h, 13h</li>
<li><strong>IBM PC BIOS Source Code</strong> - historyczny kod źródłowy</li>
</ul>
<h3 id="społeczności-i-fora">Społeczności i fora</h3>
<ul>
<li><a href="https://gynvael.coldwind.pl/">gynvael.coldwind//vx</a> + youtube: <a href="https://www.youtube.com/@GynvaelColdwind">GynvaelColdwind - YouTube</a></li>
<li><strong>flat assembler Board</strong>: <a href="https://board.flatassembler.net/">https://board.flatassembler.net/</a></li>
<li><strong>Vogons Programming Forum</strong> - retro programowanie</li>
</ul>
<h3 id="emulatowy-i-debugowanie">Emulatowy i debugowanie</h3>
<ul>
<li><strong>DOSBox-X</strong> - rozszerzona wersja DOSBox z lepszym debuggerem</li>
<li><strong>QEMU</strong> - emulator z możliwością debugowania</li>
<li><strong>Bochs</strong> - emulator x86 z wbudowanym debuggerem</li>
</ul>
<h3 id="historie-i-ciekawostki">Historie i ciekawostki</h3>
<ul>
<li><strong>&ldquo;Masters of Doom&rdquo;</strong> - historia id Software (programowanie DOS)</li>
<li><strong>Demoscene archives</strong> - <a href="https://www.pouet.net/">pouët.net :: your online demoscene resource</a>, <a href="https://scene.org/">SCENE.ORG</a></li>
<li><strong>&ldquo;Tricks of the Game Programming Gurus&rdquo;</strong> - André LaMothe</li>
</ul>
]]></content:encoded></item><item><title>BLOK 1 - Podstawy I/O i operacje na danych</title><link>https://marcinklimek.github.io/student/2025-arch/blok1_skrypt/</link><pubDate>Sat, 01 Nov 2025 00:00:00 +0000</pubDate><guid>https://marcinklimek.github.io/student/2025-arch/blok1_skrypt/</guid><description>&lt;h1 id="blok-1-podstawy-io-i-operacje-na-danych">BLOK 1: Podstawy I/O i operacje na danych&lt;/h1>
&lt;h2 id="informacje-organizacyjne">Informacje organizacyjne&lt;/h2>
&lt;p>&lt;strong>Termin oddania:&lt;/strong> do 12.12.2025&lt;br>
&lt;strong>Punktacja:&lt;/strong> 7 punktów&lt;br>
&lt;strong>Opóźnienie:&lt;/strong> -3 punkty za każdy tydzień&lt;/p>
&lt;hr>
&lt;h2 id="1-środowisko-pracy">1. Środowisko pracy&lt;/h2>
&lt;h3 id="kompilacja-w-dosbox-x">Kompilacja w DOSBox-X&lt;/h3>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">D:\&amp;gt; cd project
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">D:\PROJECT&amp;gt; cl program
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Skrypt &lt;code>cl&lt;/code> automatycznie wykonuje:&lt;/p>
&lt;ol>
&lt;li>&lt;code>tasm program.asm&lt;/code> - kompilacja do .OBJ&lt;/li>
&lt;li>&lt;code>tlink program.obj&lt;/code> - linkowanie do .EXE&lt;/li>
&lt;li>Wyświetla ewentualne błędy&lt;/li>
&lt;/ol>
&lt;h3 id="debugowanie---turbodebugger">Debugowanie - TurboDebugger&lt;/h3>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">D:\PROJECT&amp;gt; td program.exe
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;strong>Podstawowe komendy:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;code>F7&lt;/code> - Step Into (krok do instrukcji)&lt;/li>
&lt;li>&lt;code>F8&lt;/code> - Step Over (pomiń CALL)&lt;/li>
&lt;li>&lt;code>F9&lt;/code> - Run to cursor&lt;/li>
&lt;li>&lt;code>Ctrl+F2&lt;/code> - Reset programu&lt;/li>
&lt;li>&lt;code>Alt+V&lt;/code> - View menu (rejestry, pamięć, stos)&lt;/li>
&lt;/ul>
&lt;h3 id="porównanie-z-visual-studio">Porównanie z Visual Studio&lt;/h3>
&lt;p>Na zajęciach pokażę jak ten sam kod C wygląda w asemblerze pod Windows (x64).&lt;br>
To pomoże zrozumieć koncepcje uniwersalne dla każdej architektury.&lt;/p></description><content:encoded><![CDATA[<h1 id="blok-1-podstawy-io-i-operacje-na-danych">BLOK 1: Podstawy I/O i operacje na danych</h1>
<h2 id="informacje-organizacyjne">Informacje organizacyjne</h2>
<p><strong>Termin oddania:</strong> do 12.12.2025<br>
<strong>Punktacja:</strong> 7 punktów<br>
<strong>Opóźnienie:</strong> -3 punkty za każdy tydzień</p>
<hr>
<h2 id="1-środowisko-pracy">1. Środowisko pracy</h2>
<h3 id="kompilacja-w-dosbox-x">Kompilacja w DOSBox-X</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">D:\&gt; cd project
</span></span><span class="line"><span class="cl">D:\PROJECT&gt; cl program
</span></span></code></pre></td></tr></table>
</div>
</div><p>Skrypt <code>cl</code> automatycznie wykonuje:</p>
<ol>
<li><code>tasm program.asm</code> - kompilacja do .OBJ</li>
<li><code>tlink program.obj</code> - linkowanie do .EXE</li>
<li>Wyświetla ewentualne błędy</li>
</ol>
<h3 id="debugowanie---turbodebugger">Debugowanie - TurboDebugger</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">D:\PROJECT&gt; td program.exe
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Podstawowe komendy:</strong></p>
<ul>
<li><code>F7</code> - Step Into (krok do instrukcji)</li>
<li><code>F8</code> - Step Over (pomiń CALL)</li>
<li><code>F9</code> - Run to cursor</li>
<li><code>Ctrl+F2</code> - Reset programu</li>
<li><code>Alt+V</code> - View menu (rejestry, pamięć, stos)</li>
</ul>
<h3 id="porównanie-z-visual-studio">Porównanie z Visual Studio</h3>
<p>Na zajęciach pokażę jak ten sam kod C wygląda w asemblerze pod Windows (x64).<br>
To pomoże zrozumieć koncepcje uniwersalne dla każdej architektury.</p>
<hr>
<h2 id="2-instrukcje-asemblera---podstawy">2. Instrukcje asemblera - podstawy</h2>
<h3 id="21-struktura-programu-exe">2.1. Struktura programu .EXE</h3>
<p>Każdy program w asemblerze dla DOS musi mieć określoną strukturę:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">.model</span> <span class="no">small</span>          <span class="c1">; Model pamięci
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="na">.stack</span> <span class="mi">512</span>           <span class="c1">; Rozmiar stosu
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="na">.data</span>
</span></span><span class="line"><span class="cl">    <span class="c1">; Tutaj deklarujemy zmienne
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl"><span class="na">.code</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">proc</span>
</span></span><span class="line"><span class="cl">    <span class="c1">; Inicjalizacja segmentu danych
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="err">@</span><span class="no">data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ds</span><span class="p">,</span> <span class="no">ax</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">; Właściwy kod programu
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl">    <span class="c1">; Zakończenie programu
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="mi">4</span><span class="no">C00h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">endp</span>
</span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="no">main</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Wyjaśnienie:</strong></p>
<ul>
<li><code>.model small</code> - określa, że kod i dane mieszczą się w 64KB każdy</li>
<li><code>.stack 512</code> - rezerwuje 512 bajtów na stos</li>
<li><code>.data</code> - sekcja dla zmiennych zainicjalizowanych</li>
<li><code>.code</code> - sekcja z instrukcjami programu</li>
<li><code>@data</code> - adres segmentu danych (generowany przez assembler)</li>
<li><code>mov ax, 4C00h; int 21h</code> - standardowe zakończenie programu DOS</li>
</ul>
<h3 id="22-rejestry-procesora---przypomnienie">2.2. Rejestry procesora - przypomnienie</h3>
<p>Procesor 8086 ma następujące rejestry 16-bitowe, z których każdy można podzielić na dwie części 8-bitowe:</p>
<table>
  <thead>
      <tr>
          <th>Rejestr</th>
          <th>Części 8-bit</th>
          <th>Typowe użycie</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>AX</strong></td>
          <td>AH, AL</td>
          <td>Akumulator - arytmetyka, I/O, funkcje DOS</td>
      </tr>
      <tr>
          <td><strong>BX</strong></td>
          <td>BH, BL</td>
          <td>Baza - adresowanie pamięci</td>
      </tr>
      <tr>
          <td><strong>CX</strong></td>
          <td>CH, CL</td>
          <td>Licznik - pętle, przesunięcia</td>
      </tr>
      <tr>
          <td><strong>DX</strong></td>
          <td>DH, DL</td>
          <td>Dane - I/O, mnożenie/dzielenie</td>
      </tr>
  </tbody>
</table>
<p><strong>Rejestry wskaźnikowe:</strong></p>
<ul>
<li><strong>SI</strong> - Source Index (indeks źródłowy)</li>
<li><strong>DI</strong> - Destination Index (indeks docelowy)</li>
<li><strong>BP</strong> - Base Pointer (wskaźnik bazy stosu)</li>
<li><strong>SP</strong> - Stack Pointer (wskaźnik stosu)</li>
</ul>
<p><strong>Rejestry segmentowe:</strong></p>
<ul>
<li><strong>CS</strong> - Code Segment (segment kodu)</li>
<li><strong>DS</strong> - Data Segment (segment danych)</li>
<li><strong>SS</strong> - Stack Segment (segment stosu)</li>
<li><strong>ES</strong> - Extra Segment (dodatkowy segment)</li>
</ul>
<h3 id="23-przerwania-dos-int-21h">2.3. Przerwania DOS (INT 21h)</h3>
<p><strong>INT 21h</strong> to główne przerwanie DOS-u do obsługi wejścia/wyjścia.</p>
<h4 id="najważniejsze-funkcje-dla-bloku-1">Najważniejsze funkcje dla BLOKU 1:</h4>
<table>
  <thead>
      <tr>
          <th>Funkcja (AH)</th>
          <th>Opis</th>
          <th>Parametry wejściowe</th>
          <th>Wynik</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>01h</strong></td>
          <td>Czytaj znak z echo</td>
          <td>-</td>
          <td>AL = znak</td>
      </tr>
      <tr>
          <td><strong>02h</strong></td>
          <td>Wypisz znak</td>
          <td>DL = znak</td>
          <td>-</td>
      </tr>
      <tr>
          <td><strong>09h</strong></td>
          <td>Wypisz string</td>
          <td>DS:DX = adres (kończy $)</td>
          <td>-</td>
      </tr>
  </tbody>
</table>
<p><strong>Przykład użycia funkcji 02h:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">02</span><span class="no">h</span>      <span class="c1">; Funkcja 02h - wypisz znak
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">dl</span><span class="p">,</span> <span class="err">&#39;</span><span class="no">A</span><span class="err">&#39;</span>      <span class="c1">; Znak do wyświetlenia
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>          <span class="c1">; Wywołaj DOS
</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Przykład użycia funkcji 01h:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">01</span><span class="no">h</span>      <span class="c1">; Funkcja 01h - czytaj znak
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>          <span class="c1">; Wywołaj DOS
</span></span></span><span class="line"><span class="cl"><span class="c1">; Teraz AL zawiera wczytany znak
</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Przykład użycia funkcji 09h:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">.data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">tekst</span> <span class="no">db</span> <span class="err">&#39;</span><span class="no">Hello</span> <span class="no">World</span><span class="p">!</span><span class="no">$</span><span class="err">&#39;</span>    <span class="c1">; String musi kończyć się $
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl"><span class="na">.code</span>
</span></span><span class="line"><span class="cl">    <span class="nf">lea</span> <span class="no">dx</span><span class="p">,</span> <span class="no">tekst</span>    <span class="c1">; DX = adres stringa
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">09</span><span class="no">h</span>      <span class="c1">; Funkcja 09h
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>          <span class="c1">; Wyświetl string
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="24-podstawowe-operacje-arytmetyczne">2.4. Podstawowe operacje arytmetyczne</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="c1">; Dodawanie
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="mi">5</span>
</span></span><span class="line"><span class="cl"><span class="nf">add</span> <span class="no">al</span><span class="p">,</span> <span class="mi">3</span>        <span class="c1">; AL = 8
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">; Odejmowanie
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="mi">10</span>
</span></span><span class="line"><span class="cl"><span class="nf">sub</span> <span class="no">al</span><span class="p">,</span> <span class="mi">4</span>        <span class="c1">; AL = 6
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">; Inkrementacja / Dekrementacja
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">cx</span><span class="p">,</span> <span class="mi">5</span>
</span></span><span class="line"><span class="cl"><span class="nf">inc</span> <span class="no">cx</span>           <span class="c1">; CX = 6
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">dec</span> <span class="no">cx</span>           <span class="c1">; CX = 5
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="25-porównania-i-skoki-warunkowe">2.5. Porównania i skoki warunkowe</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="c1">; Porównanie
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">cmp</span> <span class="no">al</span><span class="p">,</span> <span class="mi">5</span>        <span class="c1">; Porównuje AL z 5 (AL - 5)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">je</span> <span class="no">rowne</span>         <span class="c1">; Jump if Equal (jeśli AL = 5)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">jne</span> <span class="no">nierowne</span>     <span class="c1">; Jump if Not Equal (jeśli AL ≠ 5)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">jg</span> <span class="no">wieksze</span>       <span class="c1">; Jump if Greater (jeśli AL &gt; 5, signed)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">jl</span> <span class="no">mniejsze</span>      <span class="c1">; Jump if Less (jeśli AL &lt; 5, signed)
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="26-pętle">2.6. Pętle</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">cx</span><span class="p">,</span> <span class="mi">10</span>       <span class="c1">; Licznik
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nl">petla:</span>
</span></span><span class="line"><span class="cl">    <span class="c1">; Kod do powtórzenia
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">loop</span> <span class="no">petla</span>   <span class="c1">; CX--, jeśli CX ≠ 0 skocz do &#39;petla&#39;
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="27-konwersja-cyfr-ascii">2.7. Konwersja cyfr ASCII</h3>
<p><strong>Bardzo ważne dla zadań:</strong></p>
<p>Gdy wczytujemy cyfrę z klawiatury (funkcja 01h), dostajemy jej <strong>kod ASCII</strong>, nie wartość liczbową!</p>
<table>
  <thead>
      <tr>
          <th>Cyfra</th>
          <th>Kod ASCII (hex)</th>
          <th>Kod ASCII (dec)</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>&lsquo;0&rsquo;</td>
          <td>30h</td>
          <td>48</td>
      </tr>
      <tr>
          <td>&lsquo;1&rsquo;</td>
          <td>31h</td>
          <td>49</td>
      </tr>
      <tr>
          <td>&lsquo;2&rsquo;</td>
          <td>32h</td>
          <td>50</td>
      </tr>
      <tr>
          <td>&hellip;</td>
          <td>&hellip;</td>
          <td>&hellip;</td>
      </tr>
      <tr>
          <td>&lsquo;9&rsquo;</td>
          <td>39h</td>
          <td>57</td>
      </tr>
  </tbody>
</table>
<p><strong>Konwersja cyfra ASCII → wartość liczbowa:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">01</span><span class="no">h</span>      <span class="c1">; Wczytaj cyfrę
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>          <span class="c1">; AL = &#39;5&#39; = 35h
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">sub</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="mi">0</span><span class="err">&#39;</span>      <span class="c1">; AL = 5 = 05h (wartość liczbowa)
</span></span></span><span class="line"><span class="cl"><span class="c1">; lub równoważnie:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">sub</span> <span class="no">al</span><span class="p">,</span> <span class="mi">30</span><span class="no">h</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Konwersja wartość liczbowa → cyfra ASCII:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="mi">5</span>        <span class="c1">; Wartość liczbowa
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">add</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="mi">0</span><span class="err">&#39;</span>      <span class="c1">; AL = &#39;5&#39; = 35h (kod ASCII)
</span></span></span><span class="line"><span class="cl"><span class="c1">; lub równoważnie:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">add</span> <span class="no">al</span><span class="p">,</span> <span class="mi">30</span><span class="no">h</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Konwersja małe/wielkie litery:</strong></p>
<table>
  <thead>
      <tr>
          <th>Litera</th>
          <th>Kod ASCII (hex)</th>
          <th>Różnica</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>&lsquo;A&rsquo;</td>
          <td>41h</td>
          <td>-</td>
      </tr>
      <tr>
          <td>&lsquo;a&rsquo;</td>
          <td>61h</td>
          <td>20h</td>
      </tr>
      <tr>
          <td>&lsquo;Z&rsquo;</td>
          <td>5Ah</td>
          <td>-</td>
      </tr>
      <tr>
          <td>&lsquo;z&rsquo;</td>
          <td>7Ah</td>
          <td>20h</td>
      </tr>
  </tbody>
</table>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="c1">; Wielka → mała
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="no">A</span><span class="err">&#39;</span>      <span class="c1">; AL = 41h
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">add</span> <span class="no">al</span><span class="p">,</span> <span class="mi">20</span><span class="no">h</span>      <span class="c1">; AL = 61h = &#39;a&#39;
</span></span></span><span class="line"><span class="cl"><span class="c1">; lub:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">or</span> <span class="no">al</span><span class="p">,</span> <span class="mi">20</span><span class="no">h</span>       <span class="c1">; Ustaw bit 5
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">; Mała → wielka
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="no">a</span><span class="err">&#39;</span>      <span class="c1">; AL = 61h
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">sub</span> <span class="no">al</span><span class="p">,</span> <span class="mi">20</span><span class="no">h</span>      <span class="c1">; AL = 41h = &#39;A&#39;
</span></span></span><span class="line"><span class="cl"><span class="c1">; lub:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">and</span> <span class="no">al</span><span class="p">,</span> <span class="mi">0</span><span class="no">DFh</span>     <span class="c1">; Wyzeruj bit 5
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="3-przykłady-c-vs-asembler">3. Przykłady: C vs Asembler</h2>
<h3 id="przykład-1-hello-world">Przykład 1: Hello World</h3>
<p><strong>Kod C:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Hello World!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Asembler x86-16 (TASM):</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">.model</span> <span class="no">small</span>
</span></span><span class="line"><span class="cl"><span class="na">.stack</span> <span class="mi">256</span>
</span></span><span class="line"><span class="cl"><span class="na">.data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">tekst</span> <span class="no">db</span> <span class="err">&#39;</span><span class="no">Hello</span> <span class="no">World</span><span class="p">!</span><span class="err">&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="no">Dh</span><span class="p">,</span> <span class="mi">0</span><span class="no">Ah</span><span class="p">,</span> <span class="err">&#39;</span><span class="no">$</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl">    <span class="c1">; 0Dh = Carriage Return, 0Ah = Line Feed, &#39;$&#39; = koniec
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="na">.code</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">proc</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="err">@</span><span class="no">data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ds</span><span class="p">,</span> <span class="no">ax</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">; Wyświetl string
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">lea</span> <span class="no">dx</span><span class="p">,</span> <span class="no">tekst</span>        <span class="c1">; DX = adres stringa
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">09</span><span class="no">h</span>          <span class="c1">; Funkcja 09h - wypisz string
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>              <span class="c1">; Wywołaj DOS
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl">    <span class="c1">; Zakończ program
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="mi">4</span><span class="no">C00h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">endp</span>
</span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="no">main</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Visual Studio (x64 - do demonstracji):</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="c1">; Visual Studio - Disassembly view
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">lea</span> <span class="no">rcx</span><span class="p">,</span> <span class="p">[</span><span class="no">format_string</span><span class="p">]</span>    <span class="c1">; Pierwszy parametr (64-bit)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">call</span> <span class="no">printf</span>                 <span class="c1">; Wywołanie funkcji C
</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Analiza różnic:</strong></p>
<ul>
<li><strong>DOS:</strong> Używamy przerwania INT 21h do komunikacji z systemem</li>
<li><strong>x64:</strong> Używamy wywołań funkcji biblioteki C (printf)</li>
<li><strong>DOS:</strong> String kończy się znakiem &lsquo;$&rsquo;</li>
<li><strong>C:</strong> String kończy się znakiem &lsquo;\0&rsquo; (null terminator)</li>
<li><strong>DOS:</strong> Bezpośrednia komunikacja ze sprzętem przez BIOS/DOS</li>
<li><strong>Modern:</strong> Abstrakcja przez system operacyjny</li>
</ul>
<h3 id="przykład-2-wczytanie-i-wyświetlenie-znaku">Przykład 2: Wczytanie i wyświetlenie znaku</h3>
<p><strong>Kod C:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">char</span> <span class="n">znak</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Wpisz znak: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%c&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">znak</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Wpisales: %c</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">znak</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Asembler (TASM):</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">.model</span> <span class="no">small</span>
</span></span><span class="line"><span class="cl"><span class="na">.stack</span> <span class="mi">256</span>
</span></span><span class="line"><span class="cl"><span class="na">.data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">prompt</span> <span class="no">db</span> <span class="err">&#39;</span><span class="no">Wpisz</span> <span class="no">znak</span><span class="p">:</span> <span class="no">$</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl">    <span class="nf">wynik</span> <span class="no">db</span> <span class="mi">0</span><span class="no">Dh</span><span class="p">,</span> <span class="mi">0</span><span class="no">Ah</span><span class="p">,</span> <span class="err">&#39;</span><span class="no">Wpisales</span><span class="p">:</span> <span class="no">$</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">.code</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">proc</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="err">@</span><span class="no">data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ds</span><span class="p">,</span> <span class="no">ax</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">; Wyświetl prompt
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">lea</span> <span class="no">dx</span><span class="p">,</span> <span class="no">prompt</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">09</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">; Wczytaj znak
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">01</span><span class="no">h</span>          <span class="c1">; Funkcja 01h - czytaj znak z echo
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>              <span class="c1">; AL = wczytany znak
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">bl</span><span class="p">,</span> <span class="no">al</span>           <span class="c1">; Zapisz znak w BL
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl">    <span class="c1">; Wyświetl komunikat
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">lea</span> <span class="no">dx</span><span class="p">,</span> <span class="no">wynik</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">09</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">; Wyświetl znak
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">dl</span><span class="p">,</span> <span class="no">bl</span>           <span class="c1">; Znak do wyświetlenia
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">02</span><span class="no">h</span>          <span class="c1">; Funkcja 02h - wypisz znak
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="mi">4</span><span class="no">C00h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">endp</span>
</span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="no">main</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Analiza:</strong></p>
<ul>
<li>W C używamy funkcji <code>scanf</code> i <code>printf</code> - wysokopoziomowa abstrakcja</li>
<li>W asemblerze bezpośrednio wywołujemy funkcje DOS przez INT 21h</li>
<li>Musimy ręcznie zarządzać rejestrami (AL, BL, DL)</li>
<li>Każda operacja I/O wymaga ustawienia odpowiedniej funkcji w AH</li>
</ul>
<h3 id="przykład-3-prosta-arytmetyka">Przykład 3: Prosta arytmetyka</h3>
<p><strong>Kod C:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">a</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">b</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">suma</span> <span class="o">=</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Suma: %d</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">suma</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Asembler (TASM) - wersja uproszczona:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">.model</span> <span class="no">small</span>
</span></span><span class="line"><span class="cl"><span class="na">.stack</span> <span class="mi">256</span>
</span></span><span class="line"><span class="cl"><span class="na">.data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">a</span> <span class="no">db</span> <span class="mi">5</span>
</span></span><span class="line"><span class="cl">    <span class="nf">b</span> <span class="no">db</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl">    <span class="nf">suma</span> <span class="no">db</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">.code</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">proc</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="err">@</span><span class="no">data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ds</span><span class="p">,</span> <span class="no">ax</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">; Oblicz sumę
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="no">a</span>            <span class="c1">; AL = 5
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">add</span> <span class="no">al</span><span class="p">,</span> <span class="no">b</span>            <span class="c1">; AL = AL + 3 = 8
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">suma</span><span class="p">,</span> <span class="no">al</span>         <span class="c1">; Zapisz wynik
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl">    <span class="c1">; Wyświetl wynik (zakładając jednocyfrowy)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">add</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="mi">0</span><span class="err">&#39;</span>          <span class="c1">; Konwersja na ASCII
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">dl</span><span class="p">,</span> <span class="no">al</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">02</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="mi">4</span><span class="no">C00h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">endp</span>
</span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="no">main</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Analiza:</strong></p>
<ul>
<li>C: Kompilator automatycznie przydziela zmienne</li>
<li>Asembler: Musimy jawnie zadeklarować zmienne w sekcji .data</li>
<li>C: Operacje arytmetyczne są abstrakcyjne</li>
<li>Asembler: Bezpośrednie operacje na rejestrach procesora</li>
<li>C: printf obsługuje formatowanie</li>
<li>Asembler: Ręczna konwersja liczby na znak ASCII</li>
</ul>
<h3 id="przykład-4-pętla-i-wyświetlanie">Przykład 4: Pętla i wyświetlanie</h3>
<p><strong>Kod C:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">10</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;*&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Asembler (TASM):</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">.model</span> <span class="no">small</span>
</span></span><span class="line"><span class="cl"><span class="na">.stack</span> <span class="mi">256</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">.code</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">proc</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="err">@</span><span class="no">data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ds</span><span class="p">,</span> <span class="no">ax</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">cx</span><span class="p">,</span> <span class="mi">10</span>           <span class="c1">; Licznik pętli
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl"><span class="nl">petla:</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">dl</span><span class="p">,</span> <span class="err">&#39;</span><span class="p">*</span><span class="err">&#39;</span>          <span class="c1">; Znak do wyświetlenia
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">02</span><span class="no">h</span>          <span class="c1">; Funkcja 02h
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">loop</span> <span class="no">petla</span>           <span class="c1">; CX--, jeśli CX ≠ 0 goto petla
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl">    <span class="c1">; Nowa linia
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">dl</span><span class="p">,</span> <span class="mi">0</span><span class="no">Dh</span>          <span class="c1">; Carriage Return
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">02</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">dl</span><span class="p">,</span> <span class="mi">0</span><span class="no">Ah</span>          <span class="c1">; Line Feed
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">02</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="mi">4</span><span class="no">C00h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">endp</span>
</span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="no">main</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Analiza:</strong></p>
<ul>
<li>C: Pętla <code>for</code> z jawnym licznikiem i warunkiem</li>
<li>Asembler: Instrukcja <code>LOOP</code> używa rejestru CX</li>
<li>Procesor automatycznie dekrementuje CX i sprawdza warunek</li>
<li>W C nowa linia to <code>\n</code>, w DOS to dwa znaki: CR (0Dh) + LF (0Ah)</li>
</ul>
<hr>
<h2 id="4-zadania-do-wykonania">4. Zadania do wykonania</h2>
<h3 id="forma-oddawania">Forma oddawania</h3>
<p>Każde zadanie oddajemy jako:</p>
<ol>
<li><strong>Kod źródłowy</strong> (.asm)</li>
<li><strong>Skompilowany program</strong> (.exe)</li>
<li><strong>Sprawozdanie</strong> (PDF lub MD) zawierające:
<ul>
<li>Opis rozwiązania</li>
<li>Wyjaśnienie kluczowych fragmentów kodu</li>
<li>Zrzuty ekranu z działania programu</li>
<li>Napotkane problemy i ich rozwiązania</li>
</ul>
</li>
</ol>
<h3 id="zadanie-1-hello-world">Zadanie 1: Hello World</h3>
<p><strong>Treść zadania:</strong>
Napisz program, który wyświetla na ekranie Twoje imię i nazwisko, a następnie kończy działanie.</p>
<p><strong>Wymagania:</strong></p>
<ul>
<li>Użyj funkcji DOS 09h (wyświetlanie stringa)</li>
<li>String musi kończyć się znakiem &lsquo;$&rsquo;</li>
<li>Program musi poprawnie zakończyć działanie (INT 21h, AH=4Ch)</li>
</ul>
<p><strong>Wskazówki:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">.data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">tekst</span> <span class="no">db</span> <span class="err">&#39;</span><span class="no">Twoje</span> <span class="no">Imie</span> <span class="no">Nazwisko$</span><span class="err">&#39;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>W sprawozdaniu opisz:</strong></p>
<ul>
<li>Dlaczego string musi kończyć się znakiem &lsquo;$&rsquo;?</li>
<li>Jaka jest rola instrukcji <code>lea dx, tekst</code>?</li>
<li>Co oznacza kod <code>mov ax, 4C00h; int 21h</code>?</li>
</ul>
<hr>
<h3 id="zadanie-2-wczytaj-i-wyświetl-znak">Zadanie 2: Wczytaj i wyświetl znak</h3>
<p><strong>Treść zadania:</strong>
Napisz program, który w pętli wczytuje znaki z klawiatury i wyświetla je na ekranie.<br>
Program ma pomijać wszystkie znaki oprócz cyfr (&lsquo;0&rsquo;-&lsquo;9&rsquo;).<br>
Pętla kończy się po naciśnięciu klawisza ESC (kod 1Bh).</p>
<p><strong>Wymagania:</strong></p>
<ul>
<li>Użyj funkcji 01h (wczytaj znak z echo) lub 08h (bez echo)</li>
<li>Sprawdź czy znak jest cyfrą (zakres &lsquo;0&rsquo;-&lsquo;9&rsquo;)</li>
<li>Jeśli tak - wyświetl go funkcją 02h</li>
<li>Jeśli nie - pomiń i czytaj następny</li>
<li>Zakończ po naciśnięciu ESC</li>
</ul>
<p><strong>Wskazówki:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="c1">; Sprawdzenie czy cyfra:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">cmp</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="mi">0</span><span class="err">&#39;</span>      <span class="c1">; Czy &gt;= &#39;0&#39;?
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">jb</span> <span class="no">nie_cyfra</span>     <span class="c1">; Jump if Below (mniejsze)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">cmp</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="mi">9</span><span class="err">&#39;</span>      <span class="c1">; Czy &lt;= &#39;9&#39;?
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">ja</span> <span class="no">nie_cyfra</span>     <span class="c1">; Jump if Above (większe)
</span></span></span><span class="line"><span class="cl"><span class="c1">; Tutaj jest cyfra
</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>W sprawozdaniu wyjaśnij:</strong></p>
<ul>
<li>Jaka jest różnica między funkcją 01h a 08h?</li>
<li>Dlaczego używamy instrukcji <code>jb</code> i <code>ja</code> zamiast <code>jl</code> i <code>jg</code>?</li>
<li>Jaki kod ASCII ma klawisz ESC i dlaczego taki?</li>
</ul>
<hr>
<h3 id="zadanie-3-suma-dwóch-liczb-jednocyfrowych">Zadanie 3: Suma dwóch liczb jednocyfrowych</h3>
<p><strong>Treść zadania:</strong>
Napisz program, który:</p>
<ol>
<li>Wczytuje dwie cyfry z klawiatury (znaki &lsquo;0&rsquo;-&lsquo;9&rsquo;)</li>
<li>Oblicza ich sumę jako wartości liczbowe</li>
<li>Wyświetla wynik jako <strong>literę</strong> (od A do R)</li>
</ol>
<p><strong>Przykład:</strong></p>
<ul>
<li>Wejście: &lsquo;3&rsquo; i &lsquo;5&rsquo;</li>
<li>Suma wartości: 3 + 5 = 8</li>
<li>Wynik: &lsquo;H&rsquo; (ósma litera alfabetu)</li>
</ul>
<p><strong>Wymagania:</strong></p>
<ul>
<li>Konwersja cyfr ASCII na wartości liczbowe</li>
<li>Dodawanie wartości</li>
<li>Konwersja wyniku na literę (0→&lsquo;A&rsquo;, 1→&lsquo;B&rsquo;, &hellip;, 8→&lsquo;I&rsquo;)</li>
<li>Zakładamy, że suma &lt; 18 (wynik &lt; &lsquo;S&rsquo;)</li>
</ul>
<p><strong>Wskazówki:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="c1">; Konwersja cyfra ASCII → wartość:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">sub</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="mi">0</span><span class="err">&#39;</span>      <span class="c1">; lub sub al, 30h
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">; Konwersja liczba → litera:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">add</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="no">A</span><span class="err">&#39;</span>      <span class="c1">; lub add al, 41h
</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>W sprawozdaniu wyjaśnij:</strong></p>
<ul>
<li>Dlaczego odejmujemy 30h od cyfry ASCII?</li>
<li>Jaki kod ASCII ma litera &lsquo;A&rsquo; i dlaczego to ważne?</li>
<li>Co się stanie jeśli suma będzie &gt;= 26? (opcjonalnie: jak obsłużyć?)</li>
</ul>
<hr>
<h3 id="zadanie-4-konwersja-małewielkie-litery">Zadanie 4: Konwersja małe/wielkie litery</h3>
<p><strong>Treść zadania:</strong>
Napisz program, który:</p>
<ol>
<li>Wczytuje jeden znak z klawiatury</li>
<li>Sprawdza czy to litera (mała lub wielka)</li>
<li>Jeśli mała litera → zamienia na wielką</li>
<li>Jeśli wielka litera → zamienia na małą</li>
<li>Wyświetla przekonwertowany znak</li>
</ol>
<p><strong>Wymagania:</strong></p>
<ul>
<li>Sprawdzenie zakresu &lsquo;a&rsquo;-&lsquo;z&rsquo; i &lsquo;A&rsquo;-&lsquo;Z&rsquo;</li>
<li>Konwersja przez dodanie/odjęcie 20h</li>
<li>Wyświetlenie wyniku</li>
</ul>
<p><strong>Wskazówki:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="c1">; Sprawdzenie czy wielka litera:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">cmp</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="no">A</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nf">jb</span> <span class="no">nie_wielka</span>
</span></span><span class="line"><span class="cl"><span class="nf">cmp</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="no">Z</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nf">ja</span> <span class="no">nie_wielka</span>
</span></span><span class="line"><span class="cl"><span class="c1">; Tutaj jest wielka litera
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">; Konwersja wielka → mała:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">add</span> <span class="no">al</span><span class="p">,</span> <span class="mi">20</span><span class="no">h</span>      <span class="c1">; lub or al, 20h
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">; Konwersja mała → wielka:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">sub</span> <span class="no">al</span><span class="p">,</span> <span class="mi">20</span><span class="no">h</span>      <span class="c1">; lub and al, 0DFh
</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>W sprawozdaniu wyjaśnij:</strong></p>
<ul>
<li>Dlaczego różnica między małą a wielką literą to dokładnie 20h?</li>
<li>Jaki bit jest odpowiedzialny za wielkość litery?</li>
<li>Dlaczego <code>or al, 20h</code> zamienia na małą, a <code>and al, 0DFh</code> na wielką?</li>
<li>Co program powinien zrobić jeśli wejście nie jest literą?</li>
</ul>
<hr>
<h3 id="zadanie-5-wyświetlanie-ciągu-znaków-w-pętli">Zadanie 5: Wyświetlanie ciągu znaków w pętli</h3>
<p><strong>Treść zadania:</strong>
Napisz program, który wyświetla 10 razy znak &lsquo;*&rsquo; w jednej linii,<br>
używając pętli z rejestrem CX.</p>
<p><strong>Wymagania:</strong></p>
<ul>
<li>Użycie instrukcji LOOP</li>
<li>Rejestr CX jako licznik</li>
<li>Funkcja 02h do wyświetlania pojedynczego znaku</li>
</ul>
<p><strong>Wskazówki:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">cx</span><span class="p">,</span> <span class="mi">10</span>       <span class="c1">; Licznik
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nl">petla:</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">dl</span><span class="p">,</span> <span class="err">&#39;</span><span class="p">*</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">02</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">loop</span> <span class="no">petla</span>   <span class="c1">; CX--, if CX ≠ 0 goto petla
</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>W sprawozdaniu wyjaśnij:</strong></p>
<ul>
<li>Jak działa instrukcja LOOP krok po kroku?</li>
<li>Co się stanie jeśli CX będzie miało wartość 0 przed pętlą?</li>
<li>Dlaczego używamy CX, a nie innego rejestru?</li>
<li>Jak wyświetlić 100 razy znak &lsquo;*&rsquo; używając tylko 16-bitowego CX?</li>
</ul>
<hr>
<h2 id="5-wskazówki-ogólne">5. Wskazówki ogólne</h2>
<h3 id="dobre-praktyki">Dobre praktyki</h3>
<ol>
<li>
<p><strong>Zawsze inicjalizuj segment danych</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="err">@</span><span class="no">data</span>
</span></span><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">ds</span><span class="p">,</span> <span class="no">ax</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>Zawsze poprawnie kończ program</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="mi">4</span><span class="no">C00h</span>    <span class="c1">; Kod zakończenia 0 w AL
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>Używaj znaczących nazw etykiet</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="c1">; DOBRZE:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nl">wczytaj_znak:</span>
</span></span><span class="line"><span class="cl"><span class="nl">koniec_petli:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">; ŹŹLE:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nl">etykieta1:</span>
</span></span><span class="line"><span class="cl"><span class="nl">x:</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>Dodawaj komentarze</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">01</span><span class="no">h</span>      <span class="c1">; Funkcja 01h - czytaj znak
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>          <span class="c1">; Wywołaj DOS, wynik w AL
</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
</ol>
<h3 id="częste-błędy">Częste błędy</h3>
<ol>
<li>
<p><strong>Zapomnienie o inicjalizacji DS</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="c1">; ŹŹLE:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="na">.code</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">proc</span>
</span></span><span class="line"><span class="cl">    <span class="nf">lea</span> <span class="no">dx</span><span class="p">,</span> <span class="no">tekst</span>    <span class="c1">; DS nie wskazuje na @data!
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">; DOBRZE:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="na">.code</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">proc</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="err">@</span><span class="no">data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ds</span><span class="p">,</span> <span class="no">ax</span>
</span></span><span class="line"><span class="cl">    <span class="nf">lea</span> <span class="no">dx</span><span class="p">,</span> <span class="no">tekst</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>Brak znaku &lsquo;$&rsquo; w stringu</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="c1">; ŹŹLE:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">tekst</span> <span class="no">db</span> <span class="err">&#39;</span><span class="no">Hello</span><span class="err">&#39;</span>     <span class="c1">; Funkcja 09h nie wie gdzie koniec!
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">; DOBRZE:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">tekst</span> <span class="no">db</span> <span class="err">&#39;</span><span class="no">Hello$</span><span class="err">&#39;</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>Niepoprawne zakończenie programu</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="c1">; ŹŹLE:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">ret</span>              <span class="c1">; To nie jest DOS!
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">; DOBRZE:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="mi">4</span><span class="no">C00h</span>
</span></span><span class="line"><span class="cl"><span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>Mylenie kodów ASCII z wartościami</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="c1">; ŹŹLE:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">01</span><span class="no">h</span>
</span></span><span class="line"><span class="cl"><span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>          <span class="c1">; AL = &#39;5&#39; = 35h
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">add</span> <span class="no">al</span><span class="p">,</span> <span class="mi">3</span>        <span class="c1">; AL = 38h = &#39;8&#39; (NIEPOPRAWNE!)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">; DOBRZE:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">01</span><span class="no">h</span>
</span></span><span class="line"><span class="cl"><span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>          <span class="c1">; AL = &#39;5&#39; = 35h
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">sub</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="mi">0</span><span class="err">&#39;</span>      <span class="c1">; AL = 5 (wartość liczbowa)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">add</span> <span class="no">al</span><span class="p">,</span> <span class="mi">3</span>        <span class="c1">; AL = 8
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">add</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="mi">0</span><span class="err">&#39;</span>      <span class="c1">; AL = &#39;8&#39; = 38h (ASCII)
</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>Zapomnienie o destrukcyjnym charakterze instrukcji</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="c1">; ŹŹLE:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="no">znak1</span>
</span></span><span class="line"><span class="cl"><span class="nf">add</span> <span class="no">al</span><span class="p">,</span> <span class="no">znak2</span>    <span class="c1">; AL zawiera sumę
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">dl</span><span class="p">,</span> <span class="no">al</span>       <span class="c1">; ...ale AL już straciliśmy znak1!
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">; DOBRZE:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="no">znak1</span>
</span></span><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">bl</span><span class="p">,</span> <span class="no">al</span>       <span class="c1">; Kopia na później
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">add</span> <span class="no">al</span><span class="p">,</span> <span class="no">znak2</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
</ol>
<h3 id="przydatne-kody-ascii">Przydatne kody ASCII</h3>
<table>
  <thead>
      <tr>
          <th>Znak</th>
          <th>Hex</th>
          <th>Dec</th>
          <th>Znaczenie</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>NUL</td>
          <td>00h</td>
          <td>0</td>
          <td>Null terminator (C)</td>
      </tr>
      <tr>
          <td>BEL</td>
          <td>07h</td>
          <td>7</td>
          <td>Dzwonek</td>
      </tr>
      <tr>
          <td>BS</td>
          <td>08h</td>
          <td>8</td>
          <td>Backspace</td>
      </tr>
      <tr>
          <td>TAB</td>
          <td>09h</td>
          <td>9</td>
          <td>Tabulacja</td>
      </tr>
      <tr>
          <td>LF</td>
          <td>0Ah</td>
          <td>10</td>
          <td>Line Feed (nowa linia)</td>
      </tr>
      <tr>
          <td>CR</td>
          <td>0Dh</td>
          <td>13</td>
          <td>Carriage Return</td>
      </tr>
      <tr>
          <td>ESC</td>
          <td>1Bh</td>
          <td>27</td>
          <td>Escape</td>
      </tr>
      <tr>
          <td>SPACE</td>
          <td>20h</td>
          <td>32</td>
          <td>Spacja</td>
      </tr>
      <tr>
          <td>&lsquo;0&rsquo;</td>
          <td>30h</td>
          <td>48</td>
          <td>Cyfra zero</td>
      </tr>
      <tr>
          <td>&lsquo;9&rsquo;</td>
          <td>39h</td>
          <td>57</td>
          <td>Cyfra dziewięć</td>
      </tr>
      <tr>
          <td>&lsquo;A&rsquo;</td>
          <td>41h</td>
          <td>65</td>
          <td>Wielka litera A</td>
      </tr>
      <tr>
          <td>&lsquo;Z&rsquo;</td>
          <td>5Ah</td>
          <td>90</td>
          <td>Wielka litera Z</td>
      </tr>
      <tr>
          <td>&lsquo;a&rsquo;</td>
          <td>61h</td>
          <td>97</td>
          <td>Mała litera a</td>
      </tr>
      <tr>
          <td>&lsquo;z&rsquo;</td>
          <td>7Ah</td>
          <td>122</td>
          <td>Mała litera z</td>
      </tr>
  </tbody>
</table>
<h3 id="debugowanie-w-turbodebugger">Debugowanie w TurboDebugger</h3>
<p><strong>Co warto sprawdzić:</strong></p>
<ol>
<li>
<p><strong>View → Registers</strong> - obserwuj zmiany rejestrów</p>
<ul>
<li>Czy AL zawiera poprawny kod ASCII?</li>
<li>Czy CX się prawidłowo zmniejsza w pętli?</li>
</ul>
</li>
<li>
<p><strong>View → Dump</strong> - pamięć programu</p>
<ul>
<li>Czy twoje stringi są poprawnie zakończone &lsquo;$&rsquo;?</li>
<li>Jak wyglądają dane w pamięci?</li>
</ul>
</li>
<li>
<p><strong>F7 (Step Into)</strong> - wykonuj program instrukcja po instrukcji</p>
<ul>
<li>Śledź jak zmieniają się rejestry</li>
<li>Sprawdź czy skoki warunkowe działają jak należy</li>
</ul>
</li>
<li>
<p><strong>Breakpointy (F2)</strong> - zatrzymaj program w konkretnym miejscu</p>
<ul>
<li>Postaw breakpoint przed i po krytycznej operacji</li>
<li>Sprawdź stan rejestrów</li>
</ul>
</li>
</ol>
<hr>
<h2 id="6-kryteria-oceny">6. Kryteria oceny</h2>
<p><strong>Każde zadanie oceniane jest według:</strong></p>
<table>
  <thead>
      <tr>
          <th>Kryterium</th>
          <th>Punkty</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Program działa poprawnie</td>
          <td>40%</td>
      </tr>
      <tr>
          <td>Kod jest czytelny i skomentowany</td>
          <td>20%</td>
      </tr>
      <tr>
          <td>Sprawozdanie - wyjaśnienia techniczne</td>
          <td>25%</td>
      </tr>
      <tr>
          <td>Jakość dokumentacji</td>
          <td>15%</td>
      </tr>
  </tbody>
</table>
<p><strong>Uwaga:</strong> Nawet jeśli program nie działa w 100%, możesz otrzymać punkty za:</p>
<ul>
<li>Prawidłowe podejście do problemu</li>
<li>Poprawną strukturę programu</li>
<li>Merytoryczne wyjaśnienia w sprawozdaniu</li>
<li>Próby rozwiązania i dokumentację problemów</li>
</ul>
<p><strong>Liczy się proces uczenia się i zrozumienie architektury!</strong></p>
<h3 id="co-powinno-być-w-sprawozdaniu">Co powinno być w sprawozdaniu:</h3>
<ol>
<li><strong>Opis problemu</strong> - co program ma robić</li>
<li><strong>Analiza techniczna</strong>:
<ul>
<li>Jakie funkcje DOS użyłeś i dlaczego?</li>
<li>Jakie rejestry są wykorzystywane?</li>
<li>Jak działają kluczowe fragmenty kodu?</li>
</ul>
</li>
<li><strong>Fragmenty kodu z komentarzami</strong> - najważniejsze sekcje</li>
<li><strong>Zrzuty ekranu</strong> - działający program</li>
<li><strong>Napotkane problemy</strong> - błędy i ich rozwiązania</li>
<li><strong>Wnioski</strong> - co się nauczyłeś?</li>
</ol>
<hr>
<h2 id="7-podsumowanie-co-powinniśmy-wynieść-z-bloku-1">7. Podsumowanie: Co powinniśmy wynieść z BLOKU 1</h2>
<p>Po tym bloku powinieneś rozumieć:</p>
<ol>
<li>
<p><strong>Strukturę programu w asemblerze</strong></p>
<ul>
<li>Dyrektywy .model, .stack, .data, .code</li>
<li>Procedura główna main proc&hellip;endp</li>
<li>Inicjalizacja segmentu danych</li>
<li>Zakończenie programu</li>
</ul>
</li>
<li>
<p><strong>Podstawy komunikacji z systemem DOS</strong></p>
<ul>
<li>Przerwanie INT 21h i jego funkcje</li>
<li>Funkcja 01h - wczytaj znak</li>
<li>Funkcja 02h - wypisz znak</li>
<li>Funkcja 09h - wypisz string</li>
<li>Funkcja 4Ch - zakończ program</li>
</ul>
</li>
<li>
<p><strong>Rejestry procesora i ich role</strong></p>
<ul>
<li>AX jako akumulator</li>
<li>DX do przekazywania adresów i znaków</li>
<li>CX jako licznik pętli</li>
<li>Różnica między częściami 8-bit (AH, AL) a całym 16-bit (AX)</li>
</ul>
</li>
<li>
<p><strong>Kody ASCII i konwersje</strong></p>
<ul>
<li>Różnica między kodem ASCII a wartością liczbową</li>
<li>Konwersja cyfra ASCII ↔ wartość (±30h)</li>
<li>Konwersja małe ↔ wielkie litery (±20h)</li>
<li>Znaczenie bitów w reprezentacji znaków</li>
</ul>
</li>
<li>
<p><strong>Podstawowe konstrukcje programistyczne</strong></p>
<ul>
<li>Pętle z instrukcją LOOP</li>
<li>Porównania z CMP</li>
<li>Skoki warunkowe (JE, JNE, JB, JA)</li>
<li>Proste operacje arytmetyczne (ADD, SUB, INC, DEC)</li>
</ul>
</li>
<li>
<p><strong>Myślenie &ldquo;blisko sprzętu&rdquo;</strong></p>
<ul>
<li>Każda operacja to bezpośrednia instrukcja procesora</li>
<li>Ręczne zarządzanie rejestrami</li>
<li>Brak automatycznych konwersji typów</li>
<li>Kontrola nad każdym bajtem i bitem</li>
</ul>
</li>
</ol>
<p><strong>Pamiętaj:</strong> To nie jest tylko nauka składni - to zrozumienie jak komputer rzeczywiście działa!</p>
<p>Po opanowaniu BLOKU 1 będziesz gotowy na bardziej zaawansowane tematy:</p>
<ul>
<li>Tablice i łańcuchy (BLOK 2)</li>
<li>Procedury i funkcje (BLOK 3)</li>
<li>Operacje na plikach (BLOK 4)</li>
</ul>
<hr>
<h2 id="8-zasoby-dodatkowe">8. Zasoby dodatkowe</h2>
<h3 id="kody-ascii---kompletna-tabela">Kody ASCII - kompletna tabela</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Dec  Hex  Znak | Dec  Hex  Znak | Dec  Hex  Znak | Dec  Hex  Znak
</span></span><span class="line"><span class="cl">  0  00h  NUL  |  32  20h  SPC  |  64  40h  @    |  96  60h  `
</span></span><span class="line"><span class="cl">  7  07h  BEL  |  33  21h  !    |  65  41h  A    |  97  61h  a
</span></span><span class="line"><span class="cl">  8  08h  BS   |  34  22h  &#34;    |  66  42h  B    |  98  62h  b
</span></span><span class="line"><span class="cl">  9  09h  TAB  |  35  23h  #    |  67  43h  C    |  99  63h  c
</span></span><span class="line"><span class="cl"> 10  0Ah  LF   |  36  24h  $    |  68  44h  D    | 100  64h  d
</span></span><span class="line"><span class="cl"> 13  0Dh  CR   |  37  25h  %    |  69  45h  E    | 101  65h  e
</span></span><span class="line"><span class="cl"> 27  1Bh  ESC  |  48  30h  0    |  70  46h  F    | 102  66h  f
</span></span><span class="line"><span class="cl">                |  49  31h  1    |  71  47h  G    | 103  67h  g
</span></span><span class="line"><span class="cl">                |  50  32h  2    |  72  48h  H    | 104  68h  h
</span></span><span class="line"><span class="cl">                |  57  39h  9    |  90  5Ah  Z    | 122  7Ah  z
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="przydatne-wzory">Przydatne wzory</h3>
<p><strong>Sprawdzenie czy cyfra:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">cmp</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="mi">0</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nf">jb</span> <span class="no">nie_cyfra</span>
</span></span><span class="line"><span class="cl"><span class="nf">cmp</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="mi">9</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nf">ja</span> <span class="no">nie_cyfra</span>
</span></span><span class="line"><span class="cl"><span class="c1">; tutaj jest cyfra
</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Sprawdzenie czy wielka litera:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">cmp</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="no">A</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nf">jb</span> <span class="no">nie_wielka</span>
</span></span><span class="line"><span class="cl"><span class="nf">cmp</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="no">Z</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nf">ja</span> <span class="no">nie_wielka</span>
</span></span><span class="line"><span class="cl"><span class="c1">; tutaj jest wielka litera
</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Sprawdzenie czy mała litera:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">cmp</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="no">a</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nf">jb</span> <span class="no">nie_mala</span>
</span></span><span class="line"><span class="cl"><span class="nf">cmp</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="no">z</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nf">ja</span> <span class="no">nie_mala</span>
</span></span><span class="line"><span class="cl"><span class="c1">; tutaj jest mała litera
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<p>Powodzenia!</p>
<p>Marcin Klimek<br>
Architektura i Organizacja Systemów Komputerowych<br>
WSB Nowy Sącz, 2025/2026</p>
]]></content:encoded></item><item><title>BLOK 2: Pętle, tablice i łańcuchy</title><link>https://marcinklimek.github.io/student/2025-arch/blok2_skrypt/</link><pubDate>Sat, 01 Nov 2025 00:00:00 +0000</pubDate><guid>https://marcinklimek.github.io/student/2025-arch/blok2_skrypt/</guid><description>&lt;h1 id="blok-2-pętle-tablice-i-łańcuchy">BLOK 2: Pętle, tablice i łańcuchy&lt;/h1>
&lt;h2 id="informacje-organizacyjne">Informacje organizacyjne&lt;/h2>
&lt;p>&lt;strong>Termin oddania:&lt;/strong> do 02.01.2026&lt;br>
&lt;strong>Punktacja:&lt;/strong> 8 punktów&lt;br>
&lt;strong>Opóźnienie:&lt;/strong> -3 punkty za każdy tydzień&lt;/p>
&lt;hr>
&lt;h2 id="1-środowisko-pracy">1. Środowisko pracy&lt;/h2>
&lt;h3 id="kompilacja-w-dosbox-x">Kompilacja w DOSBox-X&lt;/h3>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">D:\&amp;gt; cd project
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">D:\PROJECT&amp;gt; cl program
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Skrypt &lt;code>cl&lt;/code> automatycznie wykonuje:&lt;/p>
&lt;ol>
&lt;li>&lt;code>tasm program.asm&lt;/code> - kompilacja do .OBJ&lt;/li>
&lt;li>&lt;code>tlink program.obj&lt;/code> - linkowanie do .EXE&lt;/li>
&lt;li>Wyświetla ewentualne błędy&lt;/li>
&lt;/ol>
&lt;h3 id="debugowanie---turbodebugger">Debugowanie - TurboDebugger&lt;/h3>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">D:\PROJECT&amp;gt; td program.exe
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;strong>Podstawowe komendy:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;code>F7&lt;/code> - Step Into (krok do instrukcji)&lt;/li>
&lt;li>&lt;code>F8&lt;/code> - Step Over (pomiń CALL)&lt;/li>
&lt;li>&lt;code>F9&lt;/code> - Run to cursor&lt;/li>
&lt;li>&lt;code>Ctrl+F2&lt;/code> - Reset programu&lt;/li>
&lt;li>&lt;code>Alt+V&lt;/code> - View menu (rejestry, pamięć, stos)&lt;/li>
&lt;/ul>
&lt;h3 id="porównanie-z-visual-studio">Porównanie z Visual Studio&lt;/h3>
&lt;p>Na zajęciach pokażę jak ten sam kod C wygląda w asemblerze pod Windows (x64).&lt;br>
To pomoże zrozumieć koncepcje uniwersalne dla każdej architektury.&lt;/p></description><content:encoded><![CDATA[<h1 id="blok-2-pętle-tablice-i-łańcuchy">BLOK 2: Pętle, tablice i łańcuchy</h1>
<h2 id="informacje-organizacyjne">Informacje organizacyjne</h2>
<p><strong>Termin oddania:</strong> do 02.01.2026<br>
<strong>Punktacja:</strong> 8 punktów<br>
<strong>Opóźnienie:</strong> -3 punkty za każdy tydzień</p>
<hr>
<h2 id="1-środowisko-pracy">1. Środowisko pracy</h2>
<h3 id="kompilacja-w-dosbox-x">Kompilacja w DOSBox-X</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">D:\&gt; cd project
</span></span><span class="line"><span class="cl">D:\PROJECT&gt; cl program
</span></span></code></pre></td></tr></table>
</div>
</div><p>Skrypt <code>cl</code> automatycznie wykonuje:</p>
<ol>
<li><code>tasm program.asm</code> - kompilacja do .OBJ</li>
<li><code>tlink program.obj</code> - linkowanie do .EXE</li>
<li>Wyświetla ewentualne błędy</li>
</ol>
<h3 id="debugowanie---turbodebugger">Debugowanie - TurboDebugger</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">D:\PROJECT&gt; td program.exe
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Podstawowe komendy:</strong></p>
<ul>
<li><code>F7</code> - Step Into (krok do instrukcji)</li>
<li><code>F8</code> - Step Over (pomiń CALL)</li>
<li><code>F9</code> - Run to cursor</li>
<li><code>Ctrl+F2</code> - Reset programu</li>
<li><code>Alt+V</code> - View menu (rejestry, pamięć, stos)</li>
</ul>
<h3 id="porównanie-z-visual-studio">Porównanie z Visual Studio</h3>
<p>Na zajęciach pokażę jak ten sam kod C wygląda w asemblerze pod Windows (x64).<br>
To pomoże zrozumieć koncepcje uniwersalne dla każdej architektury.</p>
<hr>
<h2 id="2-instrukcje-asemblera---rozszerzenie-wiedzy">2. Instrukcje asemblera - rozszerzenie wiedzy</h2>
<h3 id="21-pętle-w-asemblerze">2.1. Pętle w asemblerze</h3>
<h4 id="instrukcja-loop">Instrukcja LOOP</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">cx</span><span class="p">,</span> <span class="mi">10</span>        <span class="c1">; Ustaw licznik na 10
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nl">petla:</span>
</span></span><span class="line"><span class="cl">    <span class="c1">; Kod do powtórzenia
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">loop</span> <span class="no">petla</span>    <span class="c1">; CX--, jeśli CX ≠ 0 skocz do &#39;petla&#39;
</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Jak działa LOOP:</strong></p>
<ol>
<li>Dekrementuje CX (CX = CX - 1)</li>
<li>Sprawdza czy CX ≠ 0</li>
<li>Jeśli tak - skacze do etykiety</li>
<li>Jeśli CX = 0 - kontynuuje dalej</li>
</ol>
<p><strong>UWAGA:</strong> LOOP <strong>zawsze</strong> dekrementuje CX, nawet jeśli CX=0!<br>
Wtedy CX staje się FFFFh (65535) → pętla wykona się 65535 razy!</p>
<h4 id="alternatywa-pętle-z-porównaniem">Alternatywa: pętle z porównaniem</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">cx</span><span class="p">,</span> <span class="mi">0</span>         <span class="c1">; Licznik od 0
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nl">petla:</span>
</span></span><span class="line"><span class="cl">    <span class="c1">; Kod
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">inc</span> <span class="no">cx</span>
</span></span><span class="line"><span class="cl">    <span class="nf">cmp</span> <span class="no">cx</span><span class="p">,</span> <span class="mi">10</span>
</span></span><span class="line"><span class="cl">    <span class="nf">jl</span> <span class="no">petla</span>      <span class="c1">; Jump if Less (cx &lt; 10)
</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Porównanie:</strong></p>
<table>
  <thead>
      <tr>
          <th>Metoda</th>
          <th>Zalety</th>
          <th>Wady</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>LOOP</td>
          <td>Krótki kod, klasyczny</td>
          <td>Tylko malejący licznik, ryzyko przy CX=0</td>
      </tr>
      <tr>
          <td>CMP+JMP</td>
          <td>Dowolny kierunek, elastyczny</td>
          <td>Dłuższy kod</td>
      </tr>
  </tbody>
</table>
<h3 id="22-operacje-na-stringach-łańcuchach">2.2. Operacje na stringach (łańcuchach)</h3>
<p>Procesor ma specjalne instrukcje do pracy ze stringami. Używają rejestrów <strong>SI</strong> (source index) i <strong>DI</strong> (destination index).</p>
<h4 id="flaga-kierunku-df">Flaga kierunku (DF)</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">cld</span>    <span class="c1">; Clear Direction Flag - SI/DI rosną (w górę pamięci)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">std</span>    <span class="c1">; Set Direction Flag - SI/DI maleją (w dół pamięci)
</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>ZAWSZE</strong> ustawiaj <code>cld</code> na początku operacji stringowych!</p>
<h4 id="lodsblodsw---load-string">LODSB/LODSW - Load String</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="c1">; LODSB - Load String Byte
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">lodsb</span>    <span class="c1">; AL = [DS:SI], następnie SI++
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">; LODSW - Load String Word
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">lodsw</span>    <span class="c1">; AX = [DS:SI], następnie SI+=2
</span></span></span></code></pre></td></tr></table>
</div>
</div><h4 id="stosbstosw---store-string">STOSB/STOSW - Store String</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="c1">; STOSB - Store String Byte
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">stosb</span>    <span class="c1">; [ES:DI] = AL, następnie DI++
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">; STOSW - Store String Word
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">stosw</span>    <span class="c1">; [ES:DI] = AX, następnie DI+=2
</span></span></span></code></pre></td></tr></table>
</div>
</div><h4 id="movsbmovsw---move-string">MOVSB/MOVSW - Move String</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="c1">; MOVSB - Move String Byte
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">movsb</span>    <span class="c1">; [ES:DI] = [DS:SI], SI++, DI++
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">; MOVSW - Move String Word
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">movsw</span>    <span class="c1">; [ES:DI] = [DS:SI], SI+=2, DI+=2
</span></span></span></code></pre></td></tr></table>
</div>
</div><h4 id="cmpsbcmpsw---compare-string">CMPSB/CMPSW - Compare String</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="c1">; CMPSB - Compare String Byte
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">cmpsb</span>    <span class="c1">; Porównuje [DS:SI] z [ES:DI], SI++, DI++, ustawia flagi
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">; CMPSW - Compare String Word
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">cmpsw</span>    <span class="c1">; Porównuje słowa, SI+=2, DI+=2
</span></span></span></code></pre></td></tr></table>
</div>
</div><h4 id="scasbscasw---scan-string">SCASB/SCASW - Scan String</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="c1">; SCASB - Scan String Byte
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">scasb</span>    <span class="c1">; Porównuje AL z [ES:DI], DI++, ustawia flagi
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">; SCASW - Scan String Word
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">scasw</span>    <span class="c1">; Porównuje AX z [ES:DI], DI+=2
</span></span></span></code></pre></td></tr></table>
</div>
</div><h4 id="prefiksy-powtarzania">Prefiksy powtarzania</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">rep</span> <span class="nf">movsb</span>      <span class="c1">; Powtarzaj MOVSB dopóki CX ≠ 0 (CX razy)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="na">repz</span> <span class="nf">cmpsb</span>     <span class="c1">; Powtarzaj dopóki ZF=1 i CX≠0 (dopóki równe)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="na">repnz</span> <span class="nf">scasb</span>    <span class="c1">; Powtarzaj dopóki ZF=0 i CX≠0 (dopóki różne)
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="23-adresowanie-tablic">2.3. Adresowanie tablic</h3>
<h4 id="podstawowe-tryby">Podstawowe tryby</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="p">[</span><span class="no">bx</span><span class="p">]</span>       <span class="c1">; AL = bajt pod adresem DS:BX
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="p">[</span><span class="no">si</span><span class="p">]</span>       <span class="c1">; AX = słowo pod adresem DS:SI
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">bl</span><span class="p">,</span> <span class="p">[</span><span class="no">di</span><span class="p">]</span>       <span class="c1">; BL = bajt pod adresem DS:DI (lub ES:DI dla stringów)
</span></span></span></code></pre></td></tr></table>
</div>
</div><h4 id="displacement-przesunięcie">Displacement (przesunięcie)</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="p">[</span><span class="no">bx</span><span class="err">+</span><span class="mi">5</span><span class="p">]</span>     <span class="c1">; AL = bajt pod adresem DS:BX+5
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="p">[</span><span class="no">si</span><span class="err">+</span><span class="mi">10</span><span class="p">]</span>    <span class="c1">; AX = słowo pod adresem DS:SI+10
</span></span></span></code></pre></td></tr></table>
</div>
</div><h4 id="indeksowanie-złożone">Indeksowanie złożone</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="p">[</span><span class="no">bx</span><span class="err">+</span><span class="no">si</span><span class="p">]</span>    <span class="c1">; AL = bajt pod adresem DS:BX+SI
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="p">[</span><span class="no">bp</span><span class="err">+</span><span class="no">di</span><span class="p">]</span>    <span class="c1">; AX = słowo pod adresem SS:BP+DI
</span></span></span></code></pre></td></tr></table>
</div>
</div><h4 id="przesunięcie--indeks">Przesunięcie + indeks</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="p">[</span><span class="no">bx</span><span class="err">+</span><span class="no">si</span><span class="err">+</span><span class="mi">5</span><span class="p">]</span>  <span class="c1">; AL = bajt pod adresem DS:BX+SI+5
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="24-różnica-bajt-vs-słowo-w-tablicach">2.4. Różnica: bajt vs słowo w tablicach</h3>
<p><strong>KRYTYCZNE DO ZROZUMIENIA:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">.data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">tablica_b</span> <span class="no">db</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">40</span><span class="p">,</span> <span class="mi">50</span>    <span class="c1">; Tablica bajtów
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">tablica_w</span> <span class="no">dw</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">40</span><span class="p">,</span> <span class="mi">50</span>    <span class="c1">; Tablica słów (dwa bajty)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="na">.code</span>
</span></span><span class="line"><span class="cl">    <span class="c1">; Dostęp do tablicy bajtów
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">si</span><span class="p">,</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="no">tablica_b</span><span class="p">[</span><span class="no">si</span><span class="p">]</span>    <span class="c1">; AL = 10
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">inc</span> <span class="no">si</span>                   <span class="c1">; SI = 1
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="no">tablica_b</span><span class="p">[</span><span class="no">si</span><span class="p">]</span>    <span class="c1">; AL = 20
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl">    <span class="c1">; Dostęp do tablicy słów
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">si</span><span class="p">,</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="no">tablica_w</span><span class="p">[</span><span class="no">si</span><span class="p">]</span>    <span class="c1">; AX = 10
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">add</span> <span class="no">si</span><span class="p">,</span> <span class="mi">2</span>                <span class="c1">; SI = 2 (słowo = 2 bajty!)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="no">tablica_w</span><span class="p">[</span><span class="no">si</span><span class="p">]</span>    <span class="c1">; AX = 20
</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Częsty błąd:</strong> Inkrementacja <code>inc si</code> dla tablicy słów - to da dostęp do środka słowa!</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="c1">; BŁĄD:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">si</span><span class="p">,</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="no">tablica_w</span><span class="p">[</span><span class="no">si</span><span class="p">]</span>    <span class="c1">; AX = 10 (00 0A w pamięci little-endian)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">inc</span> <span class="no">si</span>                   <span class="c1">; SI = 1 - wskazuje ŚRODEK słowa!
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="no">tablica_w</span><span class="p">[</span><span class="no">si</span><span class="p">]</span>    <span class="c1">; AX = nieprawidłowa wartość
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="3-przykłady-c-vs-asembler">3. Przykłady: C vs Asembler</h2>
<h3 id="przykład-1-pętla-for---zliczanie">Przykład 1: Pętla for - zliczanie</h3>
<p><strong>Kod C:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">10</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">count</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Count: %d</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">count</span><span class="p">);</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Asembler x86-16 (TASM):</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">.model</span> <span class="no">small</span>
</span></span><span class="line"><span class="cl"><span class="na">.stack</span> <span class="mi">256</span>
</span></span><span class="line"><span class="cl"><span class="na">.data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">wynik</span> <span class="no">dw</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">.code</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">proc</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="err">@</span><span class="no">data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ds</span><span class="p">,</span> <span class="no">ax</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">cx</span><span class="p">,</span> <span class="mi">10</span>        <span class="c1">; i = 10 (liczymy w dół)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="mi">0</span>         <span class="c1">; count = 0
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl"><span class="nl">petla:</span>
</span></span><span class="line"><span class="cl">    <span class="nf">inc</span> <span class="no">ax</span>            <span class="c1">; count++
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">loop</span> <span class="no">petla</span>        <span class="c1">; i--, if i != 0 goto petla
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">wynik</span><span class="p">,</span> <span class="no">ax</span>     <span class="c1">; Zapisz wynik
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl">    <span class="c1">; Zakończenie
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="mi">4</span><span class="no">C00h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">endp</span>
</span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="no">main</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Visual Studio (x64 - do demonstracji):</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="c1">; Visual Studio - Disassembly view
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">dword</span> <span class="no">ptr</span> <span class="p">[</span><span class="no">count</span><span class="p">],</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">dword</span> <span class="no">ptr</span> <span class="p">[</span><span class="no">i</span><span class="p">],</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="nf">jmp</span> <span class="no">short</span> <span class="no">check_loop</span>
</span></span><span class="line"><span class="cl"><span class="nl">loop_body:</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">eax</span><span class="p">,</span> <span class="no">dword</span> <span class="no">ptr</span> <span class="p">[</span><span class="no">count</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="nf">inc</span> <span class="no">eax</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">dword</span> <span class="no">ptr</span> <span class="p">[</span><span class="no">count</span><span class="p">],</span> <span class="no">eax</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">eax</span><span class="p">,</span> <span class="no">dword</span> <span class="no">ptr</span> <span class="p">[</span><span class="no">i</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="nf">inc</span> <span class="no">eax</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">dword</span> <span class="no">ptr</span> <span class="p">[</span><span class="no">i</span><span class="p">],</span> <span class="no">eax</span>
</span></span><span class="line"><span class="cl"><span class="nl">check_loop:</span>
</span></span><span class="line"><span class="cl">    <span class="nf">cmp</span> <span class="no">dword</span> <span class="no">ptr</span> <span class="p">[</span><span class="no">i</span><span class="p">],</span> <span class="mi">10</span>
</span></span><span class="line"><span class="cl">    <span class="nf">jl</span> <span class="no">short</span> <span class="no">loop_body</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Analiza różnic:</strong></p>
<ul>
<li>DOS: Używamy <code>CX</code> i instrukcji <code>LOOP</code> - procesor to rozumie natywnie</li>
<li>x64: Kompilator używa jawnych porównań <code>CMP</code> i skoków <code>JL</code></li>
<li>DOS: 16-bit rejestry (AX, CX)</li>
<li>x64: 32/64-bit rejestry (EAX, RAX)</li>
</ul>
<h3 id="przykład-2-tablica---suma-elementów">Przykład 2: Tablica - suma elementów</h3>
<p><strong>Kod C:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">tablica</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">40</span><span class="p">,</span> <span class="mi">50</span><span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">suma</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">5</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">suma</span> <span class="o">+=</span> <span class="n">tablica</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Suma: %d</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">suma</span><span class="p">);</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Asembler (TASM) - wersja 1 z LOOP:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">.model</span> <span class="no">small</span>
</span></span><span class="line"><span class="cl"><span class="na">.stack</span> <span class="mi">256</span>
</span></span><span class="line"><span class="cl"><span class="na">.data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">tablica</span> <span class="no">dw</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">40</span><span class="p">,</span> <span class="mi">50</span>    <span class="c1">; 5 słów
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">suma</span> <span class="no">dw</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">.code</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">proc</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="err">@</span><span class="no">data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ds</span><span class="p">,</span> <span class="no">ax</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">cx</span><span class="p">,</span> <span class="mi">5</span>              <span class="c1">; Licznik elementów
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">si</span><span class="p">,</span> <span class="mi">0</span>              <span class="c1">; Indeks (w bajtach)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="mi">0</span>              <span class="c1">; Akumulator sumy
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl"><span class="nl">petla:</span>
</span></span><span class="line"><span class="cl">    <span class="nf">add</span> <span class="no">ax</span><span class="p">,</span> <span class="no">tablica</span><span class="p">[</span><span class="no">si</span><span class="p">]</span>    <span class="c1">; suma += tablica[i]
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">add</span> <span class="no">si</span><span class="p">,</span> <span class="mi">2</span>              <span class="c1">; Następny element (słowo = 2 bajty)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">loop</span> <span class="no">petla</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">suma</span><span class="p">,</span> <span class="no">ax</span>           <span class="c1">; Zapisz wynik
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="mi">4</span><span class="no">C00h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">endp</span>
</span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="no">main</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Asembler (TASM) - wersja 2 z LODSW:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">.model</span> <span class="no">small</span>
</span></span><span class="line"><span class="cl"><span class="na">.stack</span> <span class="mi">256</span>
</span></span><span class="line"><span class="cl"><span class="na">.data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">tablica</span> <span class="no">dw</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">40</span><span class="p">,</span> <span class="mi">50</span>
</span></span><span class="line"><span class="cl">    <span class="nf">suma</span> <span class="no">dw</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">.code</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">proc</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="err">@</span><span class="no">data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ds</span><span class="p">,</span> <span class="no">ax</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">cld</span>                    <span class="c1">; Kierunek w górę
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">lea</span> <span class="no">si</span><span class="p">,</span> <span class="no">tablica</span>        <span class="c1">; SI wskazuje na tablicę
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">cx</span><span class="p">,</span> <span class="mi">5</span>              <span class="c1">; 5 elementów
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">bx</span><span class="p">,</span> <span class="mi">0</span>              <span class="c1">; Akumulator sumy
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl"><span class="nl">petla:</span>
</span></span><span class="line"><span class="cl">    <span class="nf">lodsw</span>                  <span class="c1">; AX = [DS:SI], SI += 2
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">add</span> <span class="no">bx</span><span class="p">,</span> <span class="no">ax</span>             <span class="c1">; suma += AX
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">loop</span> <span class="no">petla</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">suma</span><span class="p">,</span> <span class="no">bx</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="mi">4</span><span class="no">C00h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">endp</span>
</span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="no">main</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Analiza:</strong></p>
<ul>
<li><strong>Wersja 1:</strong> Jawne indeksowanie <code>tablica[si]</code></li>
<li><strong>Wersja 2:</strong> Użycie instrukcji stringowej <code>LODSW</code> - procesor automatycznie przesuwa SI</li>
<li>Oba podejścia są poprawne, <code>LODSW</code> jest bardziej &ldquo;idiomatic&rdquo; dla x86</li>
</ul>
<h3 id="przykład-3-string---długość-łańcucha">Przykład 3: String - długość łańcucha</h3>
<p><strong>Kod C:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">char</span> <span class="n">tekst</span><span class="p">[]</span> <span class="o">=</span> <span class="s">&#34;Hello&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">dlugosc</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">while</span> <span class="p">(</span><span class="n">tekst</span><span class="p">[</span><span class="n">dlugosc</span><span class="p">]</span> <span class="o">!=</span> <span class="sc">&#39;\0&#39;</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">dlugosc</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Długość: %d</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">dlugosc</span><span class="p">);</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Asembler (TASM) - wersja 1 ręczna:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">.model</span> <span class="no">small</span>
</span></span><span class="line"><span class="cl"><span class="na">.stack</span> <span class="mi">256</span>
</span></span><span class="line"><span class="cl"><span class="na">.data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">tekst</span> <span class="no">db</span> <span class="err">&#39;</span><span class="no">Hello</span><span class="err">&#39;</span><span class="p">,</span> <span class="mi">0</span>    <span class="c1">; String zakończony zerem
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">dlugosc</span> <span class="no">dw</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">.code</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">proc</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="err">@</span><span class="no">data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ds</span><span class="p">,</span> <span class="no">ax</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">si</span><span class="p">,</span> <span class="mi">0</span>              <span class="c1">; Indeks
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl"><span class="nl">petla:</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="no">tekst</span><span class="p">[</span><span class="no">si</span><span class="p">]</span>      <span class="c1">; Pobierz bajt
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">cmp</span> <span class="no">al</span><span class="p">,</span> <span class="mi">0</span>              <span class="c1">; Czy koniec?
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">je</span> <span class="no">koniec</span>              <span class="c1">; Jeśli tak - zakończ
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">inc</span> <span class="no">si</span>                 <span class="c1">; dlugosc++
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">jmp</span> <span class="no">petla</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl"><span class="nl">koniec:</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">dlugosc</span><span class="p">,</span> <span class="no">si</span>        <span class="c1">; Zapisz długość
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="mi">4</span><span class="no">C00h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">endp</span>
</span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="no">main</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Asembler (TASM) - wersja 2 z SCASB:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">.model</span> <span class="no">small</span>
</span></span><span class="line"><span class="cl"><span class="na">.stack</span> <span class="mi">256</span>
</span></span><span class="line"><span class="cl"><span class="na">.data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">tekst</span> <span class="no">db</span> <span class="err">&#39;</span><span class="no">Hello</span><span class="err">&#39;</span><span class="p">,</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="nf">dlugosc</span> <span class="no">dw</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">.code</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">proc</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="err">@</span><span class="no">data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ds</span><span class="p">,</span> <span class="no">ax</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">es</span><span class="p">,</span> <span class="no">ax</span>             <span class="c1">; ES = DS (SCASB używa ES:DI)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl">    <span class="nf">cld</span>                    <span class="c1">; Kierunek w górę
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">lea</span> <span class="no">di</span><span class="p">,</span> <span class="no">tekst</span>          <span class="c1">; DI wskazuje na tekst
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="mi">0</span>              <span class="c1">; Szukamy zera
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">cx</span><span class="p">,</span> <span class="mi">0</span><span class="no">FFFFh</span>         <span class="c1">; Maksymalna długość
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl">    <span class="na">repnz</span> <span class="nf">scasb</span>            <span class="c1">; Szukaj AL w [ES:DI], aż znajdziesz (ZF=1)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl">    <span class="c1">; CX teraz zawiera: FFFFh - długość - 1
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="c1">; Dlatego długość = FFFFh - CX
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">neg</span> <span class="no">cx</span>                 <span class="c1">; CX = -CX
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">dec</span> <span class="no">cx</span>                 <span class="c1">; CX = -(FFFFh - długość - 1) - 1 = długość
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">dlugosc</span><span class="p">,</span> <span class="no">cx</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="mi">4</span><span class="no">C00h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">endp</span>
</span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="no">main</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Analiza:</strong></p>
<ul>
<li><strong>Wersja 1:</strong> Prosta, zrozumiała, jawna logika</li>
<li><strong>Wersja 2:</strong> Używa specjalizowanej instrukcji <code>SCASB</code> z prefiksem <code>REPNZ</code>
<ul>
<li><code>REPNZ</code> = Repeat while Not Zero (dopóki nie znajdzie)</li>
<li>Po zakończeniu CX zawiera liczbę pozostałych iteracji</li>
<li>Matematyka: długość = max_cx - pozostałe_cx - 1</li>
</ul>
</li>
</ul>
<h3 id="przykład-4-debugowanie-w-turbodebugger">Przykład 4: Debugowanie w TurboDebugger</h3>
<p><strong>Program do zademonstrowania:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">.model</span> <span class="no">small</span>
</span></span><span class="line"><span class="cl"><span class="na">.stack</span> <span class="mi">256</span>
</span></span><span class="line"><span class="cl"><span class="na">.data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">tablica</span> <span class="no">db</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">.code</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">proc</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="err">@</span><span class="no">data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ds</span><span class="p">,</span> <span class="no">ax</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">cx</span><span class="p">,</span> <span class="mi">5</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">si</span><span class="p">,</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">bl</span><span class="p">,</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl"><span class="nl">petla:</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="no">tablica</span><span class="p">[</span><span class="no">si</span><span class="p">]</span>    <span class="c1">; Breakpoint tutaj (F9)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">add</span> <span class="no">bl</span><span class="p">,</span> <span class="no">al</span>
</span></span><span class="line"><span class="cl">    <span class="nf">inc</span> <span class="no">si</span>
</span></span><span class="line"><span class="cl">    <span class="nf">loop</span> <span class="no">petla</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="mi">4</span><span class="no">C00h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">endp</span>
</span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="no">main</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Co pokazać studentom w TD:</strong></p>
<ol>
<li>View → Registers - obserwacja CX, SI, BL w czasie rzeczywistym</li>
<li>View → Dump - zawartość pamięci, tablica w formacie heksadecymalnym</li>
<li>View → Stack - jak wygląda stos programu</li>
<li>F7 (Step) - wykonanie instrukcji krok po kroku</li>
<li>Śledzenie jak:
<ul>
<li><code>CX</code> maleje z każdym <code>LOOP</code></li>
<li><code>SI</code> rośnie co iterację</li>
<li><code>BL</code> akumuluje sumę</li>
<li>Flagi ZF, CF się zmieniają</li>
</ul>
</li>
</ol>
<hr>
<h2 id="4-zadania-do-wykonania">4. Zadania do wykonania</h2>
<h3 id="forma-oddawania">Forma oddawania</h3>
<p>Każde zadanie oddajemy jako:</p>
<ol>
<li><strong>Kod źródłowy</strong> (.asm)</li>
<li><strong>Skompilowany program</strong> (.exe)</li>
<li><strong>Sprawozdanie</strong> (PDF lub MD) zawierające:
<ul>
<li>Opis znalezionego błędu</li>
<li>Wyjaśnienie DLACZEGO jest to błąd (z perspektywy architektury)</li>
<li>Poprawiony kod</li>
<li>Wynik działania programu</li>
</ul>
</li>
</ol>
<h3 id="zadanie-6-zliczanie-znaków-kod-z-błędem">Zadanie 6: Zliczanie znaków (kod z błędem)</h3>
<p><strong>Treść zadania:</strong>
Poniższy program ma wczytywać znaki z klawiatury aż do naciśnięcia Enter (kod 0Dh),<br>
a następnie wyświetlić liczbę wprowadzonych znaków (bez liczenia samego Enter).</p>
<p><strong>Kod z błędem:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">.model</span> <span class="no">small</span>
</span></span><span class="line"><span class="cl"><span class="na">.stack</span> <span class="mi">256</span>
</span></span><span class="line"><span class="cl"><span class="na">.data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">komunikat</span> <span class="no">db</span> <span class="err">&#39;</span><span class="no">Wprowadz</span> <span class="no">tekst</span><span class="p">:</span> <span class="no">$</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl">    <span class="nf">wynik</span> <span class="no">db</span> <span class="mi">0</span><span class="no">Dh</span><span class="p">,</span> <span class="mi">0</span><span class="no">Ah</span><span class="p">,</span> <span class="err">&#39;</span><span class="no">Liczba</span> <span class="no">znakow</span><span class="p">:</span> <span class="no">$</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">.code</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">proc</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="err">@</span><span class="no">data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ds</span><span class="p">,</span> <span class="no">ax</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">; Wyświetl komunikat
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">lea</span> <span class="no">dx</span><span class="p">,</span> <span class="no">komunikat</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">09</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">cx</span><span class="p">,</span> <span class="mi">0</span>              <span class="c1">; Licznik znaków
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl"><span class="nl">wczytuj:</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">01</span><span class="no">h</span>            <span class="c1">; Funkcja 01h - czytaj znak z echo
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">inc</span> <span class="no">cx</span>                 <span class="c1">; Zwiększ licznik
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl">    <span class="nf">cmp</span> <span class="no">al</span><span class="p">,</span> <span class="mi">0</span><span class="no">Ah</span>            <span class="c1">; Czy to Enter?
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">jne</span> <span class="no">wczytuj</span>            <span class="c1">; Jeśli nie - czytaj dalej
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl">    <span class="c1">; Wyświetl wynik
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">lea</span> <span class="no">dx</span><span class="p">,</span> <span class="no">wynik</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">09</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">; Wyświetl liczbę (zakładamy &lt; 10)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="no">cx</span>
</span></span><span class="line"><span class="cl">    <span class="nf">add</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="mi">0</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">dl</span><span class="p">,</span> <span class="no">al</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">02</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="mi">4</span><span class="no">C00h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">endp</span>
</span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="no">main</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Twoje zadanie:</strong></p>
<ol>
<li>Uruchom program i przetestuj</li>
<li>Znajdź błąd (jest ich kilka - znajdź główny)</li>
<li>Wyjaśnij:
<ul>
<li>Co program robi źle?</li>
<li>Jaki kod zwraca klawisz Enter w DOS? (sprawdź w skrypcie lub dokumentacji)</li>
<li>Dlaczego licznik jest niepoprawny?</li>
</ul>
</li>
<li>Popraw kod i dołącz wynik działania</li>
</ol>
<p><strong>Podpowiedź:</strong> Sprawdź co zwraca INT 21h/AH=01h po naciśnięciu Enter w DOS.</p>
<hr>
<h3 id="zadanie-7-odwracanie-ciągu-znaków-kod-z-błędem">Zadanie 7: Odwracanie ciągu znaków (kod z błędem)</h3>
<p><strong>Treść zadania:</strong>
Program ma wczytać ciąg znaków (max 20 znaków) zakończony Enterem,<br>
a następnie wyświetlić go w odwrotnej kolejności.</p>
<p><strong>Kod z błędem:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">.model</span> <span class="no">small</span>
</span></span><span class="line"><span class="cl"><span class="na">.stack</span> <span class="mi">256</span>
</span></span><span class="line"><span class="cl"><span class="na">.data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">bufor</span> <span class="no">db</span> <span class="mi">21</span> <span class="no">dup</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>        <span class="c1">; Bufor na 20 znaków + Enter
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">komunikat</span> <span class="no">db</span> <span class="err">&#39;</span><span class="no">Wpisz</span> <span class="no">tekst</span> <span class="p">(</span><span class="no">max</span> <span class="mi">20</span> <span class="no">znakow</span><span class="p">):</span> <span class="no">$</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl">    <span class="nf">wynik</span> <span class="no">db</span> <span class="mi">0</span><span class="no">Dh</span><span class="p">,</span> <span class="mi">0</span><span class="no">Ah</span><span class="p">,</span> <span class="err">&#39;</span><span class="no">Odwrocony</span> <span class="no">tekst</span><span class="p">:</span> <span class="no">$</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">.code</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">proc</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="err">@</span><span class="no">data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ds</span><span class="p">,</span> <span class="no">ax</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">; Wyświetl komunikat
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">lea</span> <span class="no">dx</span><span class="p">,</span> <span class="no">komunikat</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">09</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">; Wczytaj znaki do bufora
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">si</span><span class="p">,</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl"><span class="nl">wczytuj:</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">01</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">cmp</span> <span class="no">al</span><span class="p">,</span> <span class="mi">0</span><span class="no">Dh</span>               <span class="c1">; Enter?
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">je</span> <span class="no">zakoncz_wczytywanie</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">bufor</span><span class="p">[</span><span class="no">si</span><span class="p">],</span> <span class="no">al</span>
</span></span><span class="line"><span class="cl">    <span class="nf">inc</span> <span class="no">si</span>
</span></span><span class="line"><span class="cl">    <span class="nf">cmp</span> <span class="no">si</span><span class="p">,</span> <span class="mi">20</span>                <span class="c1">; Max 20 znaków
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">jl</span> <span class="no">wczytuj</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl"><span class="nl">zakoncz_wczytywanie:</span>
</span></span><span class="line"><span class="cl">    <span class="c1">; SI zawiera długość
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="c1">; Teraz wyświetl w odwrotnej kolejności
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl">    <span class="nf">lea</span> <span class="no">dx</span><span class="p">,</span> <span class="no">wynik</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">09</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">; Wyświetl od końca
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">cx</span><span class="p">,</span> <span class="no">si</span>                <span class="c1">; CX = długość
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl"><span class="nl">wyswietl:</span>
</span></span><span class="line"><span class="cl">    <span class="nf">dec</span> <span class="no">si</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">dl</span><span class="p">,</span> <span class="no">bufor</span><span class="p">[</span><span class="no">si</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">02</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">loop</span> <span class="no">wyswietl</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="mi">4</span><span class="no">C00h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">endp</span>
</span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="no">main</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Twoje zadanie:</strong></p>
<ol>
<li>Uruchom program i przetestuj z różnymi długościami tekstu</li>
<li>Znajdź błąd związany z krótkim tekstem (np. 1 znak)</li>
<li>Wyjaśnij:
<ul>
<li>Co się dzieje gdy wpiszesz tylko 1 znak?</li>
<li>Dlaczego program wyświetla nieprawidłowe znaki?</li>
<li>Jaki jest stan SI po <code>dec si</code> gdy SI=0?</li>
</ul>
</li>
<li>Popraw kod</li>
</ol>
<p><strong>Podpowiedź:</strong> Co się stanie gdy wykonasz <code>dec si</code> a SI już jest zerem?<br>
Jak to wpływa na <code>bufor[si]</code> w kontekście 16-bitowego adresowania?</p>
<hr>
<h3 id="zadanie-8-tablica-liczb---suma-kod-z-błędem">Zadanie 8: Tablica liczb - suma (kod z błędem)</h3>
<p><strong>Treść zadania:</strong>
Program ma obliczyć sumę elementów tablicy 5 liczb i wyświetlić wynik.</p>
<p><strong>Kod z błędem:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">.model</span> <span class="no">small</span>
</span></span><span class="line"><span class="cl"><span class="na">.stack</span> <span class="mi">256</span>
</span></span><span class="line"><span class="cl"><span class="na">.data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">tablica</span> <span class="no">dw</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">50</span><span class="p">,</span> <span class="mi">75</span><span class="p">,</span> <span class="mi">25</span>     <span class="c1">; Suma = 450
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">suma</span> <span class="no">dw</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="nf">komunikat</span> <span class="no">db</span> <span class="err">&#39;</span><span class="no">Suma</span> <span class="no">elementow</span> <span class="no">tablicy</span><span class="p">:</span> <span class="no">$</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">.code</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">proc</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="err">@</span><span class="no">data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ds</span><span class="p">,</span> <span class="no">ax</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">; Oblicz sumę
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">cx</span><span class="p">,</span> <span class="mi">5</span>              <span class="c1">; 5 elementów
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">si</span><span class="p">,</span> <span class="mi">0</span>              <span class="c1">; Indeks
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl"><span class="nl">petla:</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="no">tablica</span><span class="p">[</span><span class="no">si</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="nf">add</span> <span class="no">suma</span><span class="p">,</span> <span class="no">ax</span>
</span></span><span class="line"><span class="cl">    <span class="nf">inc</span> <span class="no">si</span>                 <span class="c1">; Następny element
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">loop</span> <span class="no">petla</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">; Wyświetl komunikat
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">lea</span> <span class="no">dx</span><span class="p">,</span> <span class="no">komunikat</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">09</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">; Wyświetl sumę (zakładamy &lt; 1000, 3 cyfry)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="no">suma</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">; Setki
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">bl</span><span class="p">,</span> <span class="mi">100</span>
</span></span><span class="line"><span class="cl">    <span class="nf">div</span> <span class="no">bl</span>                 <span class="c1">; AL = setki, AH = reszta
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">add</span> <span class="no">al</span><span class="p">,</span> <span class="err">&#39;</span><span class="mi">0</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">dl</span><span class="p">,</span> <span class="no">al</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">02</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">; Dziesiątki i jedności - dalszy kod...
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="c1">; (uproszczone dla zadania)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="mi">4</span><span class="no">C00h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">endp</span>
</span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="no">main</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Twoje zadanie:</strong></p>
<ol>
<li>Uruchom program</li>
<li>Program prawdopodobnie się zawiesi lub da błędny wynik - dlaczego?</li>
<li>Znajdź błąd w pętli</li>
<li>Wyjaśnij:
<ul>
<li>Jak duży jest element typu <code>dw</code> (word)?</li>
<li>O ile bajtów powinniśmy przesuwać SI dla tablicy słów?</li>
<li>Co się stanie gdy robimy <code>inc si</code> dla tablicy <code>dw</code>?</li>
<li>Gdzie w pamięci SI będzie wskazywać po pierwszym <code>inc si</code>?</li>
</ul>
</li>
<li>Popraw kod</li>
</ol>
<p><strong>Podpowiedź:</strong> Tablica <code>dw</code> = tablica <strong>słów</strong>. Słowo = 2 bajty.<br>
Jak to wpływa na przesuwanie indeksu?</p>
<hr>
<h3 id="zadanie-9-znajdź-maksimum-kod-z-błędem">Zadanie 9: Znajdź maksimum (kod z błędem)</h3>
<p><strong>Treść zadania:</strong>
Program ma znaleźć wartość maksymalną w tablicy 10 liczb bez znaku (unsigned).</p>
<p><strong>Kod z błędem:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">.model</span> <span class="no">small</span>
</span></span><span class="line"><span class="cl"><span class="na">.stack</span> <span class="mi">256</span>
</span></span><span class="line"><span class="cl"><span class="na">.data</span>
</span></span><span class="line"><span class="cl">    <span class="c1">; Tablica liczb bez znaku (unsigned byte)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">tablica</span> <span class="no">db</span> <span class="mi">45</span><span class="p">,</span> <span class="mi">120</span><span class="p">,</span> <span class="mi">33</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">67</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="mi">89</span><span class="p">,</span> <span class="mi">178</span><span class="p">,</span> <span class="mi">50</span>
</span></span><span class="line"><span class="cl">    <span class="nf">maksimum</span> <span class="no">db</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="nf">komunikat</span> <span class="no">db</span> <span class="err">&#39;</span><span class="no">Maksimum</span><span class="p">:</span> <span class="no">$</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">.code</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">proc</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="err">@</span><span class="no">data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ds</span><span class="p">,</span> <span class="no">ax</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">; Znajdź maksimum
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">cx</span><span class="p">,</span> <span class="mi">10</span>             <span class="c1">; 10 elementów
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">si</span><span class="p">,</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="mi">0</span>              <span class="c1">; Aktualne maksimum
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl"><span class="nl">petla:</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">bl</span><span class="p">,</span> <span class="no">tablica</span><span class="p">[</span><span class="no">si</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="nf">cmp</span> <span class="no">bl</span><span class="p">,</span> <span class="no">al</span>
</span></span><span class="line"><span class="cl">    <span class="nf">jl</span> <span class="no">nie_wieksze</span>         <span class="c1">; Jump if Less (bl &lt; al)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="no">bl</span>             <span class="c1">; Nowe maksimum
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl"><span class="nl">nie_wieksze:</span>
</span></span><span class="line"><span class="cl">    <span class="nf">inc</span> <span class="no">si</span>
</span></span><span class="line"><span class="cl">    <span class="nf">loop</span> <span class="no">petla</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">maksimum</span><span class="p">,</span> <span class="no">al</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">; Wyświetl komunikat
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">lea</span> <span class="no">dx</span><span class="p">,</span> <span class="no">komunikat</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">09</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">; Wyświetl wartość (uproszczone)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">dl</span><span class="p">,</span> <span class="no">al</span>
</span></span><span class="line"><span class="cl">    <span class="nf">add</span> <span class="no">dl</span><span class="p">,</span> <span class="err">&#39;</span><span class="mi">0</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">02</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="mi">4</span><span class="no">C00h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">endp</span>
</span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="no">main</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Twoje zadanie:</strong></p>
<ol>
<li>Uruchom program i sprawdź wynik</li>
<li>Program nie znajduje prawidłowego maksimum - dlaczego?</li>
<li>Znajdź błąd koncepcyjny</li>
<li>Wyjaśnij:
<ul>
<li>Z jaką wartością inicjalizujemy AL?</li>
<li>Co się stanie jeśli wszystkie liczby w tablicy są większe od 0?</li>
<li>Jaka liczba jest największa w tablicy?</li>
<li>Dlaczego algorytm nie znajduje tej liczby?</li>
</ul>
</li>
<li>Wyjaśnij różnicę między instrukcjami:
<ul>
<li><code>JL</code> (Jump if Less)</li>
<li><code>JG</code> (Jump if Greater)</li>
<li>Która jest poprawna dla naszego przypadku?</li>
</ul>
</li>
<li>Popraw kod</li>
</ol>
<p><strong>Podpowiedź:</strong> Pomyśl jak powinno wyglądać prawidłowe <strong>zainicjalizowanie</strong> maksimum.<br>
Czy inicjalizacja na 0 ma sens dla algorytmu znajdowania maksimum?</p>
<hr>
<h3 id="zadanie-10-sortowanie-bąbelkowe-kod-z-błędem">Zadanie 10: Sortowanie bąbelkowe (kod z błędem)</h3>
<p><strong>Treść zadania:</strong>
Program ma posortować rosnąco tablicę 8 liczb algorytmem sortowania bąbelkowego<br>
i wyświetlić posortowaną tablicę.</p>
<p><strong>Kod z błędem:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span><span class="lnt">58
</span><span class="lnt">59
</span><span class="lnt">60
</span><span class="lnt">61
</span><span class="lnt">62
</span><span class="lnt">63
</span><span class="lnt">64
</span><span class="lnt">65
</span><span class="lnt">66
</span><span class="lnt">67
</span><span class="lnt">68
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="na">.model</span> <span class="no">small</span>
</span></span><span class="line"><span class="cl"><span class="na">.stack</span> <span class="mi">256</span>
</span></span><span class="line"><span class="cl"><span class="na">.data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">tablica</span> <span class="no">db</span> <span class="mi">64</span><span class="p">,</span> <span class="mi">34</span><span class="p">,</span> <span class="mi">25</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mi">22</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">90</span><span class="p">,</span> <span class="mi">88</span>
</span></span><span class="line"><span class="cl">    <span class="nf">n</span> <span class="no">dw</span> <span class="mi">8</span>
</span></span><span class="line"><span class="cl">    <span class="nf">komunikat</span> <span class="no">db</span> <span class="err">&#39;</span><span class="no">Posortowana</span> <span class="no">tablica</span><span class="p">:</span> <span class="no">$</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">.code</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">proc</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="err">@</span><span class="no">data</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ds</span><span class="p">,</span> <span class="no">ax</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">; Sortowanie bąbelkowe
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="c1">; Zewnętrzna pętla (i = 0 to n-1)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">cx</span><span class="p">,</span> <span class="no">n</span>
</span></span><span class="line"><span class="cl">    <span class="nf">dec</span> <span class="no">cx</span>                 <span class="c1">; CX = n-1 (liczba przejść)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl"><span class="nl">petla_zewnetrzna:</span>
</span></span><span class="line"><span class="cl">    <span class="nf">push</span> <span class="no">cx</span>                <span class="c1">; Zapisz licznik zewnętrzny
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl">    <span class="c1">; Wewnętrzna pętla (j = 0 to n-i-1)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">bx</span><span class="p">,</span> <span class="mi">0</span>              <span class="c1">; BX = indeks j
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl"><span class="nl">petla_wewnetrzna:</span>
</span></span><span class="line"><span class="cl">    <span class="c1">; Porównaj tablica[j] z tablica[j+1]
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="no">tablica</span><span class="p">[</span><span class="no">bx</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">dl</span><span class="p">,</span> <span class="no">tablica</span><span class="p">[</span><span class="no">bx</span><span class="err">+</span><span class="mi">1</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">cmp</span> <span class="no">al</span><span class="p">,</span> <span class="no">dl</span>
</span></span><span class="line"><span class="cl">    <span class="nf">jle</span> <span class="no">nie_zamieniaj</span>      <span class="c1">; Jump if Less or Equal (al &lt;= dl)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    
</span></span><span class="line"><span class="cl">    <span class="c1">; Zamień miejscami
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">tablica</span><span class="p">[</span><span class="no">bx</span><span class="p">],</span> <span class="no">dl</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">tablica</span><span class="p">[</span><span class="no">bx</span><span class="err">+</span><span class="mi">1</span><span class="p">],</span> <span class="no">al</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl"><span class="nl">nie_zamieniaj:</span>
</span></span><span class="line"><span class="cl">    <span class="nf">inc</span> <span class="no">bx</span>
</span></span><span class="line"><span class="cl">    <span class="nf">cmp</span> <span class="no">bx</span><span class="p">,</span> <span class="no">cx</span>             <span class="c1">; j &lt; n-1-i?
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">jl</span> <span class="no">petla_wewnetrzna</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">pop</span> <span class="no">cx</span>                 <span class="c1">; Przywróć licznik zewnętrzny
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">loop</span> <span class="no">petla_zewnetrzna</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">; Wyświetl posortowaną tablicę
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">lea</span> <span class="no">dx</span><span class="p">,</span> <span class="no">komunikat</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">09</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">cx</span><span class="p">,</span> <span class="mi">8</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">si</span><span class="p">,</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl"><span class="nl">wyswietl:</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">dl</span><span class="p">,</span> <span class="no">tablica</span><span class="p">[</span><span class="no">si</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="nf">add</span> <span class="no">dl</span><span class="p">,</span> <span class="err">&#39;</span><span class="mi">0</span><span class="err">&#39;</span>            <span class="c1">; Konwersja na ASCII (dla cyfr &lt; 10)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">02</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">dl</span><span class="p">,</span> <span class="err">&#39;</span> <span class="err">&#39;</span>            <span class="c1">; Spacja
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mov</span> <span class="no">ah</span><span class="p">,</span> <span class="mi">02</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">inc</span> <span class="no">si</span>
</span></span><span class="line"><span class="cl">    <span class="nf">loop</span> <span class="no">wyswietl</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">mov</span> <span class="no">ax</span><span class="p">,</span> <span class="mi">4</span><span class="no">C00h</span>
</span></span><span class="line"><span class="cl">    <span class="nf">int</span> <span class="mi">21</span><span class="no">h</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="no">endp</span>
</span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="no">main</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Twoje zadanie:</strong></p>
<ol>
<li>Uruchom program i sprawdź wynik</li>
<li>Program nie sortuje poprawnie - dlaczego?</li>
<li>Znajdź błąd w warunku pętli wewnętrznej</li>
<li>Wyjaśnij:
<ul>
<li>Algorytm bąbelkowy wymaga: każdy element porównać z następnym</li>
<li>Ile razy powinna wykonać się pętla wewnętrzna w pierwszym przejściu?</li>
<li>Jaka wartość jest w CX podczas pętli wewnętrznej?</li>
<li>Czy porównanie <code>cmp bx, cx</code> jest poprawne?</li>
<li>Co powinno być prawidłowym warunkiem dla pętli wewnętrznej?</li>
</ul>
</li>
<li>Dodatkowe pytanie: Dlaczego używamy <code>jle</code> zamiast <code>jge</code>?</li>
<li>Popraw kod i załącz prawidłowo posortowaną tablicę</li>
</ol>
<p><strong>Podpowiedź:</strong> Pętla wewnętrzna powinna wykonać się <code>n-1</code> razy w pierwszym przejściu,<br>
<code>n-2</code> razy w drugim itd. Czy aktualny kod to realizuje?<br>
Przeanalizuj wartość CX w kontekście obu pętli.</p>
<hr>
<h2 id="5-wskazówki-ogólne">5. Wskazówki ogólne</h2>
<h3 id="dobre-praktyki">Dobre praktyki</h3>
<ol>
<li>
<p><strong>Zawsze inicjalizuj rejestry</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">mov</span> <span class="no">cx</span><span class="p">,</span> <span class="mi">0</span>    <span class="c1">; Jawna inicjalizacja
</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>Sprawdzaj rozmiary danych</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">db</span> <span class="err">=</span> <span class="mi">1</span> <span class="no">bajt</span><span class="p">,</span> <span class="no">inc</span> <span class="no">si</span> <span class="no">o</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="nf">dw</span> <span class="err">=</span> <span class="mi">2</span> <span class="no">bajty</span><span class="p">,</span> <span class="no">inc</span> <span class="no">si</span> <span class="no">o</span> <span class="mi">2</span> <span class="p">(</span><span class="no">lub</span> <span class="no">add</span> <span class="no">si</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>Używaj CLD przed operacjami stringowymi</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="nf">cld</span>          <span class="c1">; Zawsze przed LODSB, STOSB itd.
</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>Testuj skrajne przypadki</strong></p>
<ul>
<li>Pusta tablica</li>
<li>Jeden element</li>
<li>Maksymalne wartości</li>
</ul>
</li>
</ol>
<h3 id="częste-błędy">Częste błędy</h3>
<ol>
<li>
<p><strong>Off-by-one errors</strong></p>
<ul>
<li>Pętla wykonuje się o 1 za dużo/mało</li>
<li>Nieprawidłowa inicjalizacja licznika</li>
</ul>
</li>
<li>
<p><strong>Błędna inkrementacja dla słów</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="c1">; ŹLE dla tablicy DW:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">inc</span> <span class="no">si</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">; DOBRZE:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">add</span> <span class="no">si</span><span class="p">,</span> <span class="mi">2</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>Niepoprawna inicjalizacja</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-asm" data-lang="asm"><span class="line"><span class="cl"><span class="c1">; ŹLE dla znajdowania max:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">; DOBRZE:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">mov</span> <span class="no">al</span><span class="p">,</span> <span class="no">tablica</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>  <span class="c1">; Pierwszy element
</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>Zapomnienie o znaku liczb</strong></p>
<ul>
<li><code>JL</code> vs <code>JB</code> (signed vs unsigned)</li>
<li><code>JG</code> vs <code>JA</code> (signed vs unsigned)</li>
</ul>
</li>
</ol>
<h3 id="przydatne-instrukcje-do-zadań">Przydatne instrukcje do zadań</h3>
<table>
  <thead>
      <tr>
          <th>Instrukcja</th>
          <th>Opis</th>
          <th>Przykład</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>LOOP etykieta</code></td>
          <td>CX&ndash;, if CX≠0 jump</td>
          <td>Pętle liczące</td>
      </tr>
      <tr>
          <td><code>INC reg/mem</code></td>
          <td>Zwiększ o 1</td>
          <td><code>inc si</code></td>
      </tr>
      <tr>
          <td><code>DEC reg/mem</code></td>
          <td>Zmniejsz o 1</td>
          <td><code>dec cx</code></td>
      </tr>
      <tr>
          <td><code>CMP op1, op2</code></td>
          <td>Porównaj (op1-op2)</td>
          <td>Ustawia flagi</td>
      </tr>
      <tr>
          <td><code>JE/JZ</code></td>
          <td>Jump if Equal/Zero</td>
          <td>Po CMP</td>
      </tr>
      <tr>
          <td><code>JNE/JNZ</code></td>
          <td>Jump if Not Equal</td>
          <td>Po CMP</td>
      </tr>
      <tr>
          <td><code>JL/JNGE</code></td>
          <td>Jump if Less (signed)</td>
          <td><code>a &lt; b</code></td>
      </tr>
      <tr>
          <td><code>JG/JNLE</code></td>
          <td>Jump if Greater (signed)</td>
          <td><code>a &gt; b</code></td>
      </tr>
      <tr>
          <td><code>JB/JNAE</code></td>
          <td>Jump if Below (unsigned)</td>
          <td><code>a &lt; b</code></td>
      </tr>
      <tr>
          <td><code>JA/JNBE</code></td>
          <td>Jump if Above (unsigned)</td>
          <td><code>a &gt; b</code></td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="6-kryteria-oceny">6. Kryteria oceny</h2>
<p><strong>Każde zadanie oceniane jest według:</strong></p>
<table>
  <thead>
      <tr>
          <th>Kryterium</th>
          <th>Punkty</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Program działa poprawnie</td>
          <td>40%</td>
      </tr>
      <tr>
          <td>Znaleziono i opisano błąd</td>
          <td>30%</td>
      </tr>
      <tr>
          <td>Wyjaśnienie architektury</td>
          <td>20%</td>
      </tr>
      <tr>
          <td>Jakość kodu i dokumentacji</td>
          <td>10%</td>
      </tr>
  </tbody>
</table>
<p><strong>Uwaga:</strong> Nawet jeśli nie uda Ci się w pełni naprawić programu, możesz otrzymać punkty za:</p>
<ul>
<li>Prawidłową identyfikację problemu</li>
<li>Merytoryczne wyjaśnienie</li>
<li>Próbę naprawy (nawet częściową)</li>
</ul>
<p><strong>Liczy się proces uczenia się i zrozumienie architektury!</strong></p>
<hr>
<h2 id="7-podsumowanie-co-powinniśmy-wynieść-z-bloku-2">7. Podsumowanie: Co powinniśmy wynieść z BLOKU 2</h2>
<p>Po tym bloku powinieneś rozumieć:</p>
<ol>
<li>
<p><strong>Jak procesor wykonuje pętle</strong></p>
<ul>
<li>Rola rejestru CX</li>
<li>Jak działa instrukcja LOOP</li>
<li>Alternatywy: CMP + warunkowe skoki</li>
</ul>
</li>
<li>
<p><strong>Jak procesor adresuje tablice</strong></p>
<ul>
<li>Różnica między bajtami (DB) a słowami (DW)</li>
<li>Tryby adresowania: [SI], [BX+SI], [BX+5]</li>
<li>Dlaczego słowa wymagają inkrementacji o 2</li>
</ul>
</li>
<li>
<p><strong>Specjalizowane instrukcje stringowe</strong></p>
<ul>
<li>LODSB/W, STOSB/W, MOVSB/W</li>
<li>Rola flag kierunku (CLD/STD)</li>
<li>Prefiksy REP, REPZ, REPNZ</li>
</ul>
</li>
<li>
<p><strong>Mapowanie algorytmów C na asembler</strong></p>
<ul>
<li>Jak pętla <code>for</code> staje się <code>LOOP</code></li>
<li>Jak indeksowanie tablicy <code>arr[i]</code> staje się <code>[SI]</code></li>
<li>Różnice między wysokopoziomowymi a niskopoziomowymi konstrukcjami</li>
</ul>
</li>
<li>
<p><strong>Debugowanie na poziomie architektury</strong></p>
<ul>
<li>Śledzenie rejestrów w czasie rzeczywistym</li>
<li>Obserwacja pamięci i stosu</li>
<li>Identyfikacja błędów związanych z architekturą (nie tylko logicznych)</li>
</ul>
</li>
</ol>
<p><strong>To nie jest kurs programowania - to kurs zrozumienia jak komputer działa od środka!</strong></p>
<hr>
<p>Powodzenia!</p>
<p>Marcin Klimek<br>
Architektura i Organizacja Systemów Komputerowych<br>
WSB Nowy Sącz, 2025/2026</p>
]]></content:encoded></item></channel></rss>