CALL, RET, INT, IRET, JMP
Conditional jump
Schleifen
Hier geht es um
- CALL, RET -- Call und Return
- INT, IRET -- Interrupt und Return-from-Interrupt
- JMP -- Sprung oder "Verzweigung"
- Verschiedene Befehle für den Sprung in Abhängigkeit von Bedingungen (Bedingter Sprung oder "conditional jump".
- LOOP, LOOPE, LOOPNE, LOOPNZ, LOOPZ -- verschiedene Befehle welche die Programmierung von Zählschleifen erleichtern.
CALL, RET, INT, IRET, JMP
Achtung, CALL und INT schieben Adressinformationen auf den Stack. RET und IRET entfernen diese Informationen wieder vom Stack.
Um System-Funktionen aufzurufen, wird der INT-Befehl benutzt. Man muss nicht wissen, wie dies genau funktioniert, sondern man kann hier "kochbuchartig" vorgehen.
Die Übergabe von Steuerungsanweisungen (CALL, RET, JMP) erfordert ein gewisses Verständnis. Sie können so klassifiziert werden:
- alle können entweder NEAR (das Register CS bleibt unverändert) oder FAR (das Register CS ändert seinen Inhalt) sein
- JMPs und CALLs können DIRECT sein (das Ziel der Verzweigung ist in dem Maschinencode des Befehls unmittelbar enthalten) oder INDIRECT (das Ziel wird von einer anderen Speicherstelle oder einem Register zur Verfügung gestellt. Dadurch
kann das Ziel während des Programmablaufes errechnet werden)
- wenn NEAR und DIRECT, dann kann JMP als SHORT (weniger als 128 bytes entfernt) or LONG codiert werden
Bedingter Sprung (Conditional jump)
Die verschiedenen Sprungbedingungen sind eher verwirrend. Hier eine Übersicht:
JZ bedeutet was es sagt: verzweige bei gesetztem Zero-bit
JNZ bedeutet was es sagt: verzweige, wenn das Zero-bit nicht gesetzt ist
JG größer: bedeutet "wenn die vorzeichenbehaftete
Differenz positiv ist"
JA über (above): bedeutet "wenn die nicht vorzeichenbehaftete
Differenz positiv ist"
JL kleiner (less): bedeutet "wenn die vorzeichenbehaftete
Differenz negativ ist"
JB unter (below): bedeutet "wenn die nicht vorzeichenbehaftete
Differenz negativ ist"
JC carry: ist das Gleiche wie JB
Alle bedingten Verzweigungen sind automatisch DIRECT, NEAR, and SHORT. Das bedeutet: man kann nicht weiter als 128 Bytes entfernt vor oder zurück verzweigen. Für "Verzweige wenn" Jcc <Sprungziel> kann "cc" sein:
(Zu den Flagbezeichnungen wie CF, OF, PF, SF, ZF siehe hier).
Ohne Vorzeichen (unsigned):
JA größer als CF=0 und ZF=0 (wie JNBE)
JAE größer oder gleich CF=0 (wie JNB und JNC)
JB kleiner als CF=1 (wie JNAE und JC)
JBE kleiner als oder gleich CF=1 und ZF=1 (wie JNA)
JC Carry Flag gesetzt CF=1
JNA nicht größer als CF=1 und ZF=1 (wie JBE)
JNAE nicht größer/gleich CF=1 (wie JB und JC)
JNB nicht kleiner CF=0 (wie JAE und JNC)
JNBE nicht drunter/gleich CF=0 und ZF=0 (wie JA)
JNC kein Übertrag CF=0
Mit Vorzeichen (signed):
JG größer ZF=0 und SF=OF (wie JNLE)
JGE größer/gleich SF=OF (wie JNL)
JL kleiner SF<>OF (wie JNGE)
JLE kleiner/gleich ZF=1 und SF<>OF (wie JNG)
JNG nicht größer ZF=1 oder SF<>OF (wie JLE)
JNGE nicht größer/gleich SF<>OF (wie JL)
JNL nicht kleiner SF=OF (wie JGE)
JNLE nicht kleiner/gleich ZF=0 und SF=0 (wie JG)
JNO kein Überlauf OF=0
JNS positv SF=0
JO Überlauf OF=1
JS negativ SF=1
Sonstige:
JCXZ CX-Register gleich 0
JE gleich ZF=1 (wie JZ)
JNE nicht gleich ZF=0 (wie JNZ)
JNZ nicht null ZF=0
JNP keine Parität PF=0 (wie JPO)
JP Parität PF=1 (wie JPE)
JPE gerade Parität PF=1 (wie JP)
JPO ungerade Parität PF=0 (wie JNP)
JZ null ZF=0 (wie JE)
Schleifen
Hierzu gehören LOOP, LOOPE, LOOPNE, LOOPNZ, LOOPZ.
allgemeine Syntax:
LOOPcc <Sprungziel>
Bei jedem Durchgang wird das CX-Register um 1 verringert. Danach erfolgt eine SHORT-Verzweigung zum angegebenen Sprungziel, oder der nächstfolgende Befehl wird ausgeführt. LOOPcc setzt keine Flags.
cc siehe bei Jcc. Die Bedingung bezieht sich auf die Dekrementierung von CX.
Verwendungen:
LOOP für Schleifen.
LOOPE und LOOPZ, um in Schleifen nach Werten ungleich 0 zu suchen.
LOOPNE und LOOPNZ, um in Schleifen nach Werten gleich 0 zu suchen. |