Ľ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
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) je Nasiel_t loop Cyklus môžeme nahradiť dvoma inštrukciami repne scasbje Nasiel_t |
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. |