Ľudmila Jánošíková | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Programovanie v jazyku symbolických adries | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pre 32-bitové procesory Intel | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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
Inštrukcia lods skopíruje bajt, slovo alebo dvojslovo zo zdrojového reťazca do registra AL, resp. AX, resp. EAX. Napr. príkazy cldmov esi,offset Retazec lodsb vykonajú to isté, ako mov esi,offset Retazecmov al,[esi] inc esi
stos operand
Inštrukcia stos skopíruje obsah registra AL, resp. AX, resp. EAX do cieľového reťazca.
movs operand1,operand2
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
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. ÚlohaNájdite prvý výskyt písmena ‘t’ v reťazci Text. Riešenie
.data
cmps operand1,operand2
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 je ekvivalentný postupnosti inštrukcií jecxz NicCyklus: movsb loop Cyklus repe (repeat while equal) – 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) – 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í môžeme nahradiť dvoma
inštrukciami |
Načo je vám jazyk symbolických adries?
Architektúra moderných procesorov Služby operačného systému MS-DOS Služby operačného systému Windows 95/98/NT/XP |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vydala Žilinská univerzita v Žiline, 2000. ISBN 80-7100-723-4. Otázky a pripomienky môžete poslať autorke. Naposledy upravené 19.10.2015. |