Pretože si mikroprocesor
vytvára frontu inštrukcií, nie sú z hľadiska rýchlosti behu programu skoky
to pravé. Napriek tomu by sme zložitejšie programy bez nich asi ťažko tvorili.
Aby sme mohli inštrukcie skoku používať, musíme vedieť vytvoriť návestie.
Návestie
Assembler je správne
len názov prekladača "Jazyka symbolických adries", ktorý sa pre neho časom
vžil. Názov "Jazyk symbolických adries" vyjadruje to, že miesto adries
inštrukcií používame symboly. V Turbo assembleri nie sme v názvoch návestí
nijak zvlášť obmedzovaný. Vo vkladanom assembleri môžeme za názov návestia
použiť postupnosť znakov (zaciatok, navestie). Návestie s dvojbodkou uvedieme
pred inštrukciu, na ktorú sa odkazujeme. Pri preklade je v miestach odkazu
na návestie jeho názov nahradený skutočnou adresou inštrukcie.
Nepodmienený
skok
Je to nepodmienený
skok na iné miesto programu. To musí byť označené návestím. Za inštrukciou
skoku je potom uvedený jeho názov.
-
JMP navestie
- urob skok programu na návestie (v skutočnosti sa len zmení obsah čítača
inštrukcií IP, prípadne CS pri vzdialenom skoku) V programe potom nepodmienený
skok vyzerá takto:
navestie: inštrukcia na ktorú bude odkaz
.
.
JMP navestie
Ak skoky používame,
hrozí vždy nebezpečie, že sa program zacyklí (a nikdy neskončí). Preto
je dôležité si vždy rozmyslieť, za akých okolností by k tejto kolízii mohlo
dôjsť.
Podmienený
skok
Jedná sa o skok podmienený
stavom jedného alebo viac, bitov registri príznakov F. Jen týmto spôsobom
je možné prevádzať v assembleri priame vetvenie programu. Pred inštrukciou
podmieneného skoku preto vždy prevedieme inštrukciu, ktorá použitý príznak
nastaví. V prípade, že nie je splnená podmienka skoku, pokračuje program
ďalej, ako by sa nič nedialo. Inštrukcie podmieneného skoku začínajú vždy
písmenkom J. Za ním je skratka udávajúca na akých bitoch registru F je
skok závislý.
- JE návestie - skok na návestie pri ZF = 1
- JZ návestie - skok na návestie pri ZF = 1
- JNE návestie - skok na návestie pri ZF = 0
- JNZ návestie - skok na návestie pri ZF = 0
- JC návestie - skok na návestie pri CF = 1
- JNC návestie - skok na návestie pri CF = 0
- JS návestie - skok na návestie pri SF = 1
- JNS návestie - skok na návestie pri SF = 0
- JO návestie - skok na návestie pri OF = 1
- JNO návestie - skok na návestie pri OF = 0
- JP návestie - skok na návestie pri PF = 1
- JNP návestie - skok na návestie pri PF = 0
- JPE návestie - skok na návestie pri PF = 1
- JPO návestie - skok na návestie pri PF = 0
- JA návestie - skok na návestie pri (CF = 0) AND (ZF = 0)
- JNBE návestie - skok na návestie pri (CF = 0) AND (ZF = 0)
- JAE návestie - skok na návestie pri CF = 0
- JNB návestie - skok na návestie pri CF = 0
- JB návestie - skok na návestie pri CF = 1
- JNAE návestie - skok na návestie pri CF = 1
- JBE návestie - skok na návestie pri (CF = 1) OR (ZF = 1)
- JNA návestie - skok na návestie pri (CF = 1) OR (ZF = 1)
- JG návestie - skok na návestie pri (ZF = 0) OR (SF = OF)
- JNLE návestie - skok na návestie pri (ZF = 0) OR (SF = OF)
- JGE návestie - skok na návestie pri SF = OF
- JNL návestie - skok na návestie pri SF = OF
- JL návestie - skok na návestie pri SF <> OF
- JNGE návestie - skok na návestie pri SF <> OF
- JLE návestie - skok na návestie pri (ZF = 1) OR (SF <> OF)
- JNG návestie - skok na návestie pri (ZF = 1) OR (SF <> OF)
Pri hľadaní inštrukcie
podmieneného skoku musíme myslieť na to, za akých okolností chceme skok
vykonať. K tomu je tiež dobré si uvedomiť:
- A < B => A - B < 0 => SF = 1
- A = B => A - B = 0 => ZF = 1
- A > B => A - B > 0 => SF = 0
Rozdiel čísel v tomto
prípade prevedieme najlepšie inštrukciou CMP. Pre tvorbu cyklu môžeme
použiť jeden z registrov, ktorý si pre krokovaciu premennú vyčleníme. Jednoduchý
cyklus potom vytvoríme podmieneným skokom:
main() {
asm MOV CL, 10 // do registra CL dosaď 10, počet krokov
nav: // návestie, tu umiestnime opakovanú činnosť
asm {
DEC CL // odčítaj od CL číslo 1
JNZ nav // ak nie je nula skoč na návestie
}
}
Program opakuje
skok dokiaľ nie je v registri CL nulový výsledok.