Begriffserklärung?
-
Hy,
Kann mir jemand einige Begriffe erklären?
Ich versuche folgenden Code zu verstehen:mov bx, '1' Main: CMP bx, '1' JE near test1 call test2 loop Main test1: ret test2 iret
Was ist der Unterschied zwischen Call... und JMP (JE)...?
Was bedeutet das NEAR im JMP?
Was ist der Unterschied zwischen RET und IRET?Ich danke vielmals.
MFG
RS
-
ReneS schrieb:
Kann mir jemand einige Begriffe erklären?
Ich versuche folgenden Code zu verstehen:mov bx, '1' Main: CMP bx, '1' JE near test1 call test2 loop Main test1: ret test2 iret
Der Code dürfte IMHO so ne Menge Ärger machen...dazu erstmal die Begriffe:
Was ist der Unterschied zwischen Call... und JMP (JE)...?
Ein CALL ist ein Aufruf einer Unterfunktion, damit man am Ende der UNterfunktion per RET wieder an den AUfrufer zurückkehrt, wird die Rückkehradrfesse aufm Stack zwischengelagert. Ein JMP ist ein SPrung, d.h. man springt irgendwo hin, kann aber NICHT per RET oder ähnlichem zurückkehren.
Was bedeutet das NEAR im JMP?
Near bedeutet, dass man im aktuellen Segment bleibt, dazu soltlest du dir genauer die Bedeutung von CS, DS, ES & co. angucken. Für den Moment reicht wohl zu sagen, dass es ein "kurzer" Sprung ist.
Was ist der Unterschied zwischen RET und IRET?
RET springt aus Unterfunktionen die mit CALL aufgerufen worden sind, zurück, dazu benötigt es die Rücksprungadrsese, die aufm Stack vom CALL gespeichert wurde. IRET wird benutzt um aus einer Interrupt-Behandlungsroutine (meist im OS) zurückzuspringen und darf auch im prinzip nu aus solchen aufgerufen werden.
Der Code ist nun aus mehreren Gründen zum Scheitern verurteilt:
1. per JE, also ein Sprung wird test1 angesteuert. Dort steht aber ein RET, was zum Aufrufer zurückspringen will. Einen Aufrufer gibts bei Sprüngen aber nicht, deswegen wird das Ding sich das nehmen was gerade aufm Stack rumlag und da hinspringen. Und das ist i.A. nicht das was man will
2. per CALL near, also einer Funktionsaufruf wird test2 aufgerufen. Dort steht dann aber ein IRET, obwohl es garnicht in einer Interruptbnehandlungsroutine ist. Auch hier wird sich IRET neben einer vom CALL immerhin noch gespeiocherten Rückkehradresse noch andere Werte vom Stack holen, wiederum einfach was gerade da ist, wiederzum Garant für Ärger.Ich empfehle dir, dir einen "besseren" Code zu suchen, ich schätze die Einträge in der Assembelr-FAQ sollten da einiges herhalten.
-
Ich danke vielmals.
Ich habe den Code nur zur beschreibung geschrieben.MFG
RS