Ľudmila Jánošíková

Programovanie v jazyku symbolických adries

pre 32-bitové procesory Intel
Obsah Index
Reťazcové inštrukcie

Reťazcové inštrukcie slúžia na spracovanie polí typu byte, word a dword. Polia môžu obsahovať akékoľvek čísla, nielen znaky. Pomocou jednej inštrukcie môžeme spracovať (skopírovať, prezrieť, porovnať) celý blok dát. S použitím týchto inštrukcií je kód kratší, ako keby sme použili zodpovedajúcu kombináciu inštrukcií mov, inc a loop.

Pred vykonaním reťazcovej inštrukcie musíme do registra ESI uložiť offset zdrojového reťazca a do EDI offset cieľového reťazca. Registre ESI a EDI sa považujú za indexy v reťazcoch. Po vykonaní príslušnej operácie s jedným prvkom reťazca (skopírovaní, porovnaní, …) sa automaticky k indexu ESI, resp. EDI pripočíta (ak je príznak DF nastavený na 0) alebo odpočíta (ak DF = 1) počet bajtov, ktoré zaberá jeden prvok reťazca (1, 2 alebo 4 v závislosti od typu reťazca). Typ reťazca oznámime inštrukcii buď tak, že meno reťazca (reťazcov) uvedieme ako operand (operandy) inštrukcie, alebo zapíšeme inštrukciu bez operandov, ale s príponou b, ak je typ reťazca byte, w, ak je typ reťazca word, alebo d, ak je typ reťazca dword. Upozorňujeme, že operandy len informujú prekladač o type polí; adresa polí sa neurčuje podľa operandov, ale berie sa z registrov ESI, resp. EDI.

lods operand
lodsb
lodsw
lodsd
(load data from string)

OF SF ZF AF PF CF
- - - - - -

Inštrukcia lods skopíruje bajt, slovo alebo dvojslovo zo zdrojového reťazca do registra AL, resp. AX, resp. EAX. Napr. príkazy

cld
mov esi,offset Retazec
lodsb

vykonajú to isté, ako

mov esi,offset Retazec
mov al,[esi]
inc esi

stos operand
stosb
stosw
stosd
(store data to string)

OF SF ZF AF PF CF
- - - - - -

Inštrukcia stos skopíruje obsah registra AL, resp. AX, resp. EAX do cieľového reťazca.

movs operand1,operand2
movsb
movsw
movsd
(move data from string to string)

OF SF ZF AF PF CF
- - - - - -

Inštrukcia movs skopíruje bajt, slovo alebo dvojslovo zo zdrojového reťazca do cieľového reťazca. Pri prenose sa nepoužíva akumulátor. Táto inštrukcia sa vykoná rýchlejšie ako kombinácia lods/stos.

scas operand
scasb
scasw
scasd
(scan string)

OF SF ZF AF PF CF
* * * * * *

Inštrukcia scas porovná bajt, slovo alebo dvojslovo reťazca s obsahom akumulátora AL, resp. AX či EAX. Reťazec sa adresuje pomocou EDI, ale v operácii porovnania vystupuje vo funkcii zdrojového operandu: jeho hodnota sa odčíta od akumulátora a nastavia sa príznaky.

Na nasledujúcom príklade ukážeme použitie inštrukcie scasb.

Úloha

Nájdite prvý výskyt písmena ‘t’ v reťazci Text.

Riešenie

.data
Text DB ’Toto je text.’
Dlzka EQU $-Text
.code
main PROC
        mov edi,offset Text
        mov al,’t’
        mov ecx,Dlzka
        cld
Cyklus: scasb
        je Nasiel_t
        loop Cyklus
Nenasiel_t: ...
...
Nasiel_t: dec edi; ukáž späť na ’t’
...

cmps operand1,operand2
cmpsb
cmpsw
cmpsd
(compare string operands)

OF SF ZF AF PF CF
* * * * * *

Inštrukcia cmps porovná dva reťazce tak, že bajt (slovo/dvojslovo) na adrese EDI odčíta od bajtu (slova/dvojslova) na adrese ESI a nastaví príznakové bity. Inštrukcie scas a cmps sú jediné inštrukcie, ktoré porušujú pravidlo o tom, že pravý operand v aritmetickej operácii je zdrojový a ľavý cieľový, pretože odčítajú cieľový operand od zdrojového.

Opakovanie reťazcových inštrukcií možno dosiahnuť aj bez inštrukcie cyklu. Stačí použiť niektorý z nasledujúcich prefixov:

rep (repeat)

– opakuje reťazcovú inštrukciu, kým sa nevynuluje register ECX. Ak je na začiatku register ECX nulový, inštrukcia sa nevykoná ani raz. Prefix rep sa používa pred inštrukciami movs a stos. Napr. príkaz

        rep movsb

je ekvivalentný postupnosti inštrukcií

        jecxz Nic
Cyklus: movsb
        loop Cyklus

repe (repeat while equal)
repz (repeat while zero)

– opakuje reťazcovú inštrukciu, kým je register ECX ¹ 0 a zároveň ZF = 1. Ak je na začiatku register ECX nulový, inštrukcia sa nevykoná ani raz. Prefix repe/repz sa používa pred inštrukciami scas a cmps.

repne (repeat while not equal)
repnz (repeat while not zero)

– opakuje reťazcovú inštrukciu, kým je register ECX ¹ 0 a zároveň ZF = 0. Ak je na začiatku register ECX nulový, inštrukcia sa nevykoná ani raz. Prefix repne/repnz sa používa pred inštrukciami scas a cmps, napr. postupnosť inštrukcií

Cyklus: scasb
        je Nasiel_t
        loop Cyklus

môžeme nahradiť dvoma inštrukciami

        repne scasb
        je Nasiel_t

Hore

Načo je vám jazyk symbolických adries?

Architektúra moderných procesorov

Registre

Spôsoby adresovania

Premenné a návestia

Symbolické konštanty

Inštrukčný súbor

Segmentové direktívy

Moduly

Služby operačného systému MS-DOS

Služby operačného systému Windows 95/98/NT/XP

Systémová úroveň vstupu a výstupu

Prostriedky pre prípravu programu

Inštrukcie pre nastavenie príznakových bitov | BCD aritmetika
Vydala Žilinská univerzita v Žiline, 2000. ISBN 80-7100-723-4.
Otázky a pripomienky môžete poslať autorke.
Naposledy upravené 19.10.2015.