Ľudmila Jánošíková | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Programovanie v jazyku symbolických adries | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pre 32-bitové procesory Intel | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Skokové inštrukcie
Skokové inštrukcie menia postupné poradie vykonávania inštrukcií programu. Vykonávajú nepodmienený alebo podmienený skok na adresu inštrukcie v rovnakom alebo inom kódovom segmente. Ak je operandom inštrukcie skoku návestie, hovoríme o priamom skoku. Operandom inštrukcie skoku však môže byť aj premenná alebo register, ktorý obsahuje adresu novej inštrukcie. V takom prípade hovoríme o nepriamom skoku. Skokové inštrukcie nemenia príznaky.
Nepodmienený skokPriamy skok jmp návestie (jump) Inštrukcia jmp vykonáva priamy nepodmienený skok. Na nasledujúcej programovej sekvencii si ukážeme, akým spôsobom sa prekladá priamy nepodmienený skok a vysvetlíme problémy, ktoré s tým súvisia. jmp Nav Nasleduje strojový kód tejto sekvencie spolu s adresami v kódovom segmente. Všimnite si, že operandom inštrukcie jmp v strojovom kóde je relatívna vzdialenosť (displacement) medzi adresou nasledujúcej inštrukcie a návestím. 0040340A EB 02 jmp Nav0040340C 33 C0 xor eax,eax 0040340E 33 C9 Nav: xor ecx,ecx Po dekódovaní inštrukcie jmp Nav je v registri EIP offset nasledujúcej inštrukcie xor eax,eax (0040340C). Procesor spracuje inštrukciu jmp tak, že jej operand pripočíta k aktuálnej hodnote čítača inštrukcií EIP (EIP := 0040340C + 02 = 0040340E). Tak dostaneme offset inštrukcie, na ktorej má pokračovať vykonávanie programu. Nepriamy skok Pri nepriamom skoku je operandom inštrukcie jmp register alebo pamäťové miesto veľkosti 32 bitov. Obsah registra alebo pamäťového miesta sa chápe ako offset inštrukcie, na ktorej má pokračovať vykonávanie programu. Príklad použitia nepriameho skoku je v nasledujúcom kóde, ktorý vypíše reťazec po znakoch. TITLE MASM VypisRetazca(main.asm)INCLUDE Irvine32.inc .data Retaz DB "No nazdar!",0Dh,0Ah,0; deklarácia premennej Adr DD ? .code main PROC mov Adr,offset Koniec mov ecx,offset Vypis mov edx,offset Retaz; ulož do edx adresu 1. znaku reťazca mov edi,0; prvý znak má index 0 Vypis: mov al,[edx+edi]; ulož do al znak na offsete edx+edi cmp al,0; porovnaj al s nulou jne Dalej; podmienený skok nemôže byť nepriamy
jmp Adr; skok na Koniec
Dalej: call WriteChar; vypíš znak, ktorého ASCII kód je v al inc edi; zvýš index o 1 - prejdi na ďalší znak
jmp ecx Podmienené skokyPodmienené skoky umožňujú vetviť program v závislosti od nastavenia príznakov ZF, CF, SF, PF a OF. Podmienené skoky majú tvar jcc návestie, kde cc (condition code) je skratka podmienky. Ak je podmienka splnená, skok sa vykoná. Zoznam všetkých inštrukcií podmieneného skoku je v tab. 7.
Pretože inštrukcie podmieneného skoku sa najčastejšie používajú po inštrukcii porovnania dvoch operandov (cmp operand1, operand2), vyjadrujú podmienky above, below, greater, less a equal vzťah medzi týmito operandami. Príkazy s podmienkou above alebo below testujú príznakové bity CF a ZF. Tieto príznaky sa nastavujú pri operáciách s číslami bez znamienka. Z toho vyplýva, že inštrukcie s podmienkami above a below používame po porovnaní operandov bez znamienka, napr. ja vykoná skok vtedy, ak bol operand1 väčší ako operand2. Inštrukcie s podmienkami greater a less sa používajú po porovnaní operandov so znamienkom, napr. jl vykoná skok vtedy, ak bol operand1 menší než operand2. Medzi inštrukcie podmieneného skoku patria ešte inštrukcie jcxz návestie (jump if CX register is 0) jecxz návestie (jump if ECX register is 0) Inštrukcie vykonajú skok na návestie, keď register CX, resp. ECX obsahuje nulu. Podmienené skoky musia byť priame. |
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é 28.9.2015. |