Assembler – príklady
Súčet dvoch čísel uložených premenných
Sečtěte dve 32bitová čísla uložené v premenných cislo1 a číslo2, výsledok uložíme do premennej vysledok (tiež 32-bitová premenná).
Riešenie príkladu musíme rozložiť do troch častí. V prvej naplníme vybrané registre požadovanými hodnotami, v druhej je sčítame, a v tretej časti zapíšeme výsledok. Výber registrov riadime veľkosťou použitých dát.
mov eax, [cislo1] ; pamätáte si? hranaté zátvorky znamenajú prístup do pamäte mov ebx, [cislo2]; do registra EBX načítame obsah druhej "premennej" add eax, ebx; EAX = EAX + EBX mov [vysledok], eax ; výsledok uložíme do "premennej" vysledok ... cislo1 dd 08; tu sme definovali "premennú" cislo1 a zároveň sme do nej vložili čislo 8 cislo2 dd 2; do premennej "cislo2" sme vložili čislo 2 vysledok dd 0; vysledok bude 8 + 2 = 010
Môžeme ušetriť register EBX, ak program prepíšeme takto:
mov eax, [cislo1]; nahraj hodnotu "premennej" cislo1 do registra EAX add eax, [cislo2] ; sčítaj register EAX a "premennu" číslo2 mov [vysledok], eax ; výsledok ulož na adresu určenú symbolom vysledok cislo1 dd 08 ; tu sme definovali "premennú" cislo1 a zároveň sme do nej vložili číslo 8 cislo2 dd 2 ; do premennej "cislo2" sme vložili číslo 2 vysledok dd 0 ; výsledok bude 8 + 2 = 010
Určenie či je číslo párne alebo nepárne
Príklad: Určite, či je v registri AX uložené číslo párne alebo nepárne!
Každé nepárne číslo má najnižší bit nastavený na 1. Inštrukciou SHR môžeme tento bit presunúť do príznaku prenosu CF (carry) a vykonať podmienený skok podľa príznaku prenosu inštrukciou JC.
push ax; nechceme stratiť hodnotu v registri AX, uložíme ju na zásobník shr ax, 1 ; najnižší bit sa presunul do príznaku CF pop ax ; do registra AX vrátime pôvodnú hodnotu, register príznakov inštrukcie POP nemení. jc neparne ; ak jepríznak nastavený, číslo je nepárne sude: ; tu môže nasledovať nejaká akcia, ak je párne neparne: ; tu bude program pokračovať, ak je v AX číslo nepárne.
Ako už býva zvykom, program môžeme zapísať aj oveľa jednoduchšie:
test al, 1 ; najnižší bit bitovej masky bude jedna, vykonáme inštrukciu TEST jz je_parne ; príznak nuly ZF (zero flag) bude nastavený, ak bude najnižší bit nula, číslo bude párne neparne: .... je_parne: ; program bude pokračovať tu, ak bude číslo v AX párne.
Všimnime si, že sme testovali len register AL, nie celý AX. Vyššie bity registra AX sú pre nás nezaujímavé, a preto sme mohli testovať len register AL.