Értelemszerűen a programfutás alapesetben olyan módon történik, hogy egyik instrukció után jön a következő, kihagyás, és visszalépés nélkül. A kulcsszó: alapesetben. Vannak instrukciók, amik olyan funkciót látnak el, hogy a futásirányt elterelik más pontra. Ez annyit jelent, hogy vannak olyan instrukciók, amiket szimplán kihagy a program, átugrik egy másik részre. Azt, hogy onnan visszatérhet-e, vagy nem, mi döntjük el.
A JMP és CALL instrukcióknak 2 formájuk van: abszolút (A-) és hosszú (L-). Abszolút jelölés esetében az instrukció a programszámláló 2kbyte-os blokkjában érvényes*; hosszú jelölés esetén a teljes 64kbyte elérhető. Így lesz ACALL, LCALL, AJMP, és LJMP.
Jelen instrukciók jelentései:
- JMP - jump (ugrás)
- CALL (hívás)
- RET - return (visszatérés)
- RETI - return from interrupt (megszakításból való visszatérés)
LJMP/AJMP
Ez az instrukció a programot úgy tereli el, hogy nem jegyzi meg azt a helyet, AHONNAN elmozdult.
ajmp 4000h
ljmp 6a40h
JMP
A program összegzi az a és dptr értékeit, és az eredményt veszi ugrási célpontul.
jmp @a+dptr
SJMP
A program a megadott pozícióba ugrik, viszont ez a pozíció relatív, emiatt -128 és +127 között mozoghat.
sjmp 85h
ACALL/LCALL
A program elugrik a kijelölt helyre, viszont az eredeti helyre vissza lehet hozni a RET instrukcióval.
Ilyenkor az eredeti hely pozíciója eltárolódik a veremben, így érdemes a vermet be- és visszalépéskor ugyanolyan állapotban tartani.
acall 8645h
lcall 0aff0h
RET
Visszatéríti a programot a legutóbbi ACALL/LCALL utáni pozícióba.
ret
RETI
Ha megszakítás történt, ezzel az instrukcióval lehet a programot visszatéríteni a főszálra.
reti
Nincsenek megjegyzések:
Megjegyzés küldése
Mit gondolsz?