Instrukce skoku
Protože si mikroprocesor
vytváří frontu instrukcí, nejsou z hlediska rychlosti běhu
programu skoky to pravé. Přesto bychom složitější programy
bez nich asi těžko tvořili. Abychom mohli instrukce skoku
používat, musíme umět vytvořit návěští.
Návěští
Assembler je správně jen název
překladače "Jazyka symbolických adres", který se
pro něj čassem vžil. Název "Jazyk symbolických
adres" vyjadřuje to, že místo adres instrukcí
používáme symboly. V Turbo assembleru nejsme v názvech
návěští nijak zvlášť omezováni. Ve vkládaném assembleru
můžeme za název návěští použít posloupnost znaků
začínající znakem @ (@1, @zacatek, @navesti). Jestliže
používáme návěští, deklarované mimo vkládaný assembler
(s pomocí LABEL), není přítomnost znaku @ nutná. Návěští
s dvojtečkou uvedeme před instrukci, na kterou se odkazujeme.
Při překladu je v místech odkazu na návěští jeho název
nahrazen skutečnou adresou instrukce.
Nepodmíněný skok
Je to nepodmíněný skok na jiné
místo programu. To musí být označené návěštím. Za
instrukcí skoku je potom uveden jeho název.
- JMP
návěští - proveď skok programu na návěští (ve
skutečnosti se jen změní obsah čítače instrukcí
IP, případně CS při vzdáleném skoku) V programu
potom nepodmíněný skok vypadá takto:
@navesti: instrukce na kterou bude odkaz
.
.
JMP
@navesti
Jestliže skoky používáme,
hrozí vždy nebezpečí, že se program zacykluje (a nikdy
neskončí). Proto je důležité si vždy rozmyslet, za jakých
okolností by k této kolizi mohlo dojít.
Podmíněný skok
Jedná se o skok podmíněný
stavem jednoho nebo více, bitů registru příznaků F. Jen
tímto způsobem je možné provádět v assembleru přímé
větvení programu. Před instrukcí podmíněného skoku proto
vždy provedeme instrukci, která použitý příznak nastaví. V
případě, že není splněna podmínka skoku, pokračuje
program dál, jako by se nic nedělo. Instrukce podmíněného
skoku začínají vždy písmenkem J. Za ním je zkratka
udávající na jakých bitech registru F je skok závislý.
- JE
návěští - skok na návěští při ZF = 1
- JZ
návěští - skok na návěští při ZF = 1
- JNE
návěští - skok na návěští při ZF = 0
- JNZ
návěští - skok na návěští při ZF = 0
- JC
návěští - skok na návěští při CF = 1
- JNC
návěští - skok na návěští při CF = 0
- JS
návěští - skok na návěští při SF = 1
- JNS
návěští - skok na návěští při SF = 0
- JO
návěští - skok na návěští při OF = 1
- JNO
návěští - skok na návěští při OF = 0
- JP
návěští - skok na návěští při PF = 1
- JNP
návěští - skok na návěští při PF = 0
- JPE
návěští - skok na návěští při PF = 1
- JPO
návěští - skok na návěští při PF = 0
- JA
návěští - skok na návěští při (CF = 0) AND (ZF =
0)
- JNBE
návěští - skok na návěští při (CF = 0) AND (ZF =
0)
- JAE
návěští - skok na návěští při CF = 0
- JNB
návěští - skok na návěští při CF = 0
- JB
návěští - skok na návěští při CF = 1
- JNAE
návěští - skok na návěští při CF = 1
- JBE
návěští - skok na návěští při (CF = 1) OR (ZF =
1)
- JNA
návěští - skok na návěští při (CF = 1) OR (ZF =
1)
- JG
návěští - skok na návěští při (ZF = 0) OR (SF =
OF)
- JNLE
návěští - skok na návěští při (ZF = 0) OR (SF =
OF)
- JGE
návěští - skok na návěští při SF = OF
- JNL
návěští - skok na návěští při SF = OF
- JL
návěští - skok na návěští při SF <> OF
- JNGE
návěští - skok na návěští při SF <> OF
- JLE
návěští - skok na návěští při (ZF = 1) OR (SF
<> OF)
- JNG
návěští - skok na návěští při (ZF = 1) OR (SF
<> OF)
Při hledání instrukce
podmíněného skoku musíme myslet na to, za jakých okolností
chceme skok vykonat. K tomu je také dobré si uvědomit:
- A < B => A - B < 0
=> SF = 1
- A = B => A - B = 0 =>
ZF = 1
- A > B => A - B > 0
=> SF = 0
Rozdíl čísel v tomto případě
provedeme nejlépe instrukcí CMP. Pro tvorbu
cyklu můžeme použít jeden z registrů, který si pro
krokovací proměnnou vyčleníme. Jednoduchý cyklus pak
vytvoříme podmíněným skokem:
begin
asm
MOV CL, 10 {do registru CL dosaď 10, počet kroků}
@nav: {návěští, odsud umístíme opakovanou činnost}
DEC CL {odečti od CL číslo 1}
JNZ @nav {jestliže není nula skoč na návěští}
end;
end.
Program opakuje skok dokud není v
registru CL nulový výsledek.
|