Keresés

Címkék

2025-04-19

Programfutás átirányítása (JMP, CALL, RET, RETI)

É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?