Die Assembly 'call' vs 'jmp'
Ich habe gesagt, um zu versuchen und verwenden Sie 'jmp eher als 'Anruf', sondern 'jmp' ist nicht gefällt mir .. wenn ich springen, es nicht mehr zurück (so dass es nie beendet und nicht glückliche Tage ), aber ruft zurück und beendet als normal.
Ich bin glücklich mit 'call', aber gibt es eigentlich einen Grund, ich sollte versuchen und zu überwinden, 'jmp' ?
Diesem einfachen code, der zeigt nur, ob, wenn ich jmp
es kehrt nie zurück und beendet sich.
_start:
jmp _Print
jmp _Exit
ret
_Exit:
; normal exit
ret
_Print
; print something
ret
auch .. bei mir läuft das alles in einem Linux-terminal, wenn das etwas ändert.
- Dies ist mehrdeutig, und sehr unklar. JMP nicht in den stack (durch drücken der return-Wert), so ist, wenn man einen
ret
eine gefälschte Absenderadresse bekommt knallte aus dem Stapel entfernt werden und der code springt zu ihm. Sie fälschen einecall
mit einemjmp
aber vor zu tun, jmp, müssen Sie drücken Sie die return-Adresse auf den stack selbst. Was assembler ist und was OS sind Sie targeting? 16-oder 32-bit? - Ich denke, deine Frage könnte eine Antwort haben, ähnlich zu diesem: stackoverflow.com/a/28133370/3857942 .
- Es gibt keinen Grund, der mir einfällt (in diesem Fall) zu verwenden
JMP
statt, außer zu getan werden in der Schule zu lehren, wie Sie eineCALL
undRET
Funktion zusammen durch die Simulation derCALL
mitJMP
. Es wird auch lernen Sie etwas über den stack - Einige der Antworten in diesem thread nützlich sein könnten. stackoverflow.com/questions/41205054/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, zunächst
jmp
einfach 'springt' zu dem Etikett, das Sie geben, um es (das ist ein Speicher-Adresse als Programm-Anweisungen werden im Speicher gespeichert), währendcall
speichert die Stelle, an der es zurück (unter dercall
Anweisung) auf dem stack liegt,jmp
auf das Etikett, und dann auf dieret
Unterricht,jmp
zurück zu dem, was Position gespeichert wurde (wie oben schon gesagt, unterhalb der call-Anweisung). Ein bisschen ein Unterschied, wie Sie es sehen können. IMHO, ich glaube, es ist in Ordnung, einfachcall
Funktionen, wie das ist, was der c++ compiler ist mit Funktionen, aber wenn Sie müssenjmp
, dann ist das soweit in Ordnung, nur sicherstellen, dasspush
die Rückkehr Speicherort oder erstellen Sie einen anderen label zurückzukehren, wenn Sie fertig ausführen von code.Hier ist ein Beispiel für das springen zu anderen Labels, wenn Sie fertig sind:
oder Sie konnte einfach anrufen 🙂