Ľudmila Jánošíková

Programovanie v jazyku symbolických adries

pre 32-bitové procesory Intel
Obsah Index
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.

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

Nepodmienený skok

Priamy 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
     xor eax,eax
Nav: xor ecx,ecx

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 Nav
0040340C 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
Koniec:
exit
main ENDP
END main

Podmienené skoky

Podmienené 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.

Tabuľka 7
Inštrukcie podmieneného skoku
Inštrukcia Význam Podmienka
jb
jnae
jc
jump if below
jump if not above or equal
jump if carry
CF = 1
jae
jnb
jnc
jump if above or equal
jump if not below
jump if not carry
CF = 0
jbe
jna
jump if below or equal
jump if not above
CF = 1 or ZF = 1
ja
jnbe
jump if above
jump if not below or equal
CF = 0 and ZF = 0
je
jz
jump if equal
jump if zero
ZF = 1
jne
jnz
jump if not equal
jump if not zero
ZF = 0
jl
jnge
jump if less
jump if not greater or equal
SF ¹ OF
jge
jnl
jump if greater or equal
jump if not less
SF = OF
jle
jng
jump if less or equal
jump if not greater
ZF = 1 or SF ¹ OF
jg
jnle
jump if greater
jump if not less or equal
ZF = 0 and SF = OF
jp
jpe
jump if parity
jump if parity even
PF = 1
jnp
jpo
jump if not parity
jump if parity odd
PF = 0
js jump if sign SF = 1
jns jump if not sign SF = 0
jo jump if overflow OF = 1
jno jump if not overflow OF = 0

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.

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 posuv a rotáciu | Inštrukcie cyklu
Vydala Žilinská univerzita v Žiline, 2000. ISBN 80-7100-723-4.
Otázky a pripomienky môžete poslať autorke.
Naposledy upravené 28.9.2015.