Exit-Syscall (60)
Teil des Abschnitts Grundlagen der Assembly-Journey von Coddy. Lektion 32 von 45.
Der wichtigste Systemaufruf für jedes Programm ist exit. Ohne ihn würde dein Programm für immer weiterlaufen oder abstürzen, wenn es das Ende des Speichers erreicht.
Die Nummer des exit-Systemaufrufs ist 60.
Syntax:
mov rax, 60 ; Syscall-Nummer für exit
mov rdi, 0 ; Exit-Code (0 = Erfolg)
syscall ; das OS bitten zu beendenWas passiert, wenn du <strong>syscall</strong> mit <strong>rax = 60</strong> ausführst:
- Die CPU springt in den Linux-Kernel
- Der Kernel sieht: "exit syscall with code 0"
- Der Kernel beendet dein Programm
- Der Kernel gibt die Kontrolle an die Shell oder das Betriebssystem zurück
Der Exit-Code 0 bedeutet Erfolg: Das Programm wurde ohne Fehler abgeschlossen. Exit-Codes von 1 bis 255 weisen auf verschiedene Fehler hin. Du kannst eine beliebige Zahl auswählen, um zu signalisieren, was schiefgelaufen ist.
Warum Exit-Codes wichtig sind:
Nachdem dein Programm beendet wurde, speichert die Shell (das Terminal) den Exit-Code. Du kannst ihn mit Folgendem überprüfen:
./myprogram
echo $? ; Gibt den Exit-Code ausDies ist nützlich für:
- Skripte, die prüfen, ob ein Programm erfolgreich war
- Fehlerbehebung (unterschiedliche Codes für unterschiedliche Fehler)
- Das Verketten von Programmen
Ein vollständiges Minimalprogramm:
section .text
global _start
_start:
mov rax, 60 ; Exit-Systemaufruf
mov rdi, 0 ; Exit-Code 0 (Erfolg)
syscallDieses Programm tut nichts Sichtbares. Es beendet sich einfach erfolgreich. Aber es ist ein gültiges, vollständiges Programm.
Sehen wir uns an, was global _start und _start: sind.
| Code | Was es ist | Warum du es brauchst |
|---|---|---|
global _start | Teilt dem linker mit, wo dein Programm beginnt | Ohne diese Angabe weiß der linker nicht, welches Label der Einstiegspunkt ist |
_start: | Ein Label, das den Beginn deines Codes markiert | Die CPU beginnt hier mit der Ausführung |
Du musst dir die Details nicht merken. Du solltest nur wissen, dass jedes main.asm diese beiden Zeilen vor deinem Code enthalten muss. Du wirst sie in jedem Programm verwenden.
Was passiert, wenn du den exit syscall vergisst?
Wenn du den exit syscall nicht einfügst, führt die CPU weiterhin beliebige Daten aus, die sich zufällig nach deinem Code im Speicher befinden. Das verursacht normalerweise einen Speicherzugriffsfehler (Absturz) oder völlig unerwartetes Verhalten. Dein Programm wird nicht ordnungsgemäß beendet.
Beende dein Programm immer mit einem exit-syscall.
Aufgabe
Füge den Exit-Systemaufruf mit dem Exit-Code 5 hinzu.
Der Code zum Ausgeben der Nachricht "Exiting with code 5" ist bereits für dich bereitgestellt. Du musst ihn noch nicht verstehen. Er wird in Kapitel 5 behandelt.
Deine Aufgabe besteht nur darin, am Ende den Exit-Systemaufruf hinzuzufügen.
Probier es selbst
section .data
msg db 'Exiting with code 5', 0x0a
msgLen equ $ - msg
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msgLen
syscall
; TODO: Füge den Exit-Syscall mit Exit-Code 5 hinzu
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Grundlagen
1Die Maschine
Was ist eine CPUSpeicherRegister vs. SpeicherWie Befehle funktionierenZwei-Dateien-MusterDie x86-64 ArchitekturÜbe selbstständig: Assembly-Playground