Mit jmp zu C-Funktion springen
-
Hi,
warum funktioniert dieser Code nicht?
void Func() { } int main() { __asm { jmp Func } }
Das Programm stürzt ab.
-
Achso. Mit call funktioniert es.
Aber warum nicht mit jmp? Ist das nicht das gleiche?
-
Lies dir bitte ein gutes Assembler-Tutorial oder -Buch durch, dann wirst du verstehen warum das mit jmp nicht funktionieren kann.
Lies insbesondere das Kapitel über Funktionsaufrufe und den Stack.(Tipp: func() rechnet nicht damit mit jmp angesprungen zu werden. Nimm call.)
-
p.s.:
func() hat am Ende den Befehl ret stehen. Dieser Befehl erwartet auf dem Stack die Rücksprungadresse. Mit jmp gibt es die aber nicht.
-
genau und auf dem stack befindet sich ja nichts, bzw. irgendwelche anderen daten, d.h. bei dem ret springt er an irgendeine undefinierte stelle
-
Ich weiß nicht aber könntest du nicht einfach jmp offset func schreiben?
-
Nein, das wuerde aus bereits genannten Gruenden (ret) ebenfalls abstuerzen. Hier geht es auch nicht um irgend eine Syntax, sondern einzig und allein darum, dass die jmp-Instruktion an dieser Stelle zum Absturz fuehrt.
-
Kann man denn den call-Befehl durch andere Befehle nachbilden? Also die Rücksprungadresse selbst auf den Stack pushen und dann den jmp ausführen?
-
Ja.
In manchen Faellen macht das sogar Sinn.
-
Nobuo T schrieb:
Ja.
In manchen Faellen macht das sogar Sinn.Erläutern sie dies bitte.
-
Dies werde ich am besten anhand eines Beispielcodes darlegen:
push offset @@weiter ;Ruecksprunfgaddresse cmp [Option],02h je short Proc1 jb short Proc2 ja short Proc3 ;Optionen... @@Weiter: ;hier geht's weiter ... Proc Proc1 ... ret ;hier zurueck zu "@@weiter" Endp Proc1 ...