Exit-Programm x86
Ich Lerne, x86 assembly. Ich versuche zu verstehen, wie "Programm beenden" funktioniert auf x86. Wir haben einen code :
push ebp
mov ebp,esp
//Some stuff here
mov esp, ebp
pop ebp
ret
Wenn der Prozessor führt die Anweisung "ret" :
EIP wird Wert, der vom stack geholt, in anderen Worten 0.
also Prozessor geht an Adresse 0 und wird versuchen, die Anweisungen auszuführen, ... die nicht enthalten Programm-code/ausführbaren code.
Also, was ist wirklich Los mit Prozessor? Gibt es Zustand zu überprüfen, zum Beispiel if EIP = 0 -> exit program?
Or if ESP out of bounds -> exit program?
`Wie Prozessor versteht, dass dieses RET-Anweisung ist das Ende des Programms?
- Der Begriff "Programm" und "beenden" sind nur aussagekräftig in Zusammenhang mit einem Betriebssystem. Consult Ihr Betriebssystem Anleitung, wie der Zugriff auf diese Konzepte programmgesteuert. (Auf einen typischen desktop-OS, es wäre system-Aufrufe für das erstellen und beenden eines Prozesses.)
- ".. knallte vom Stapel, in anderen Worten 0." Wie kamen Sie zu dieser Schlussfolgerung? Ihr Programm heißt "von" - Adresse 0"?
Du musst angemeldet sein, um einen Kommentar abzugeben.
main()
heißt, die aus der normalen C-runtime-Initialisierung-Funktionen. Schreibenmain
in jeder Sprache, einschließlich der asm, ist nicht anders schriftlich keine andere Funktion.Ausführung beginnt bei
_start
. Wenn Sie schreiben Ihre eigenen_start
hat das nichts zurückkehren, so dass Sie brauchen, um eineexit(2)
system nennen. (oder segmentation Fault.)Diese Frage kommt bei die Frage aus einem anderen Blickwinkel, aber meine Antwort auf eine andere aktuelle Frage geht mehr ins detail.
Wie immer, single-stepping mit einem debugger ist ein guter Weg, um zu sehen, was Los ist, und testen Sie Ihr Verständnis.
Der Prozess wird beendet durch das Betriebssystem. Wenn Sie sehen, eine return-Anweisung gibt es einen ("versteckten") - Funktion, bevor Sie Ihre Funktion, die dann zurück gegeben Ausführung.
Einen Weg, der den Prozess beendet, auf einem Linux (32-bit) Umwelt wird durch den Aufruf einer bestimmten system-call: sys_exit
Dies ist wahrscheinlich das, was die Funktion bevor Sie die Funktion tut. Obigen code die Hände Befehl an das Betriebssystem zurückgeben, die dann beendet werden.
eax=0
/int 0x80
istsys_restart_syscall
. Sie möchtenmov eax, 1
fürsys_exit
in der 32-bit -int 0x80
ABI, odereax=60
im x86-64syscall
ABI. (odereax=231
/syscall
fürsys_exit_group
zu beenden alle threads, wie libc istexit(3)
verwendet nach der Spülung stdio-Puffer und andere Aufräumarbeiten.) Und natürlichxor ebx,ebx
ist der empfohlene Weg, um eine null-register.