Chiamata di sistema di uscita (60)
Fa parte della sezione Fondamenti del percorso Assembly di Coddy. Lezione 32 di 45.
La chiamata di sistema più importante per qualsiasi programma è exit. Senza di essa, il tuo programma continuerebbe a essere eseguito per sempre o andrebbe in crash quando raggiunge la fine della memoria.
Il numero della chiamata di sistema exit è 60.
Sintassi:
mov rax, 60 ; numero di syscall per l'uscita
mov rdi, 0 ; codice di uscita (0 = successo)
syscall ; chiede al sistema operativo di terminareCosa succede quando esegui <strong>syscall</strong> con <strong>rax = 60</strong>:
- La CPU passa al kernel di Linux
- Il kernel vede: "exit syscall with code 0"
- Il kernel termina il tuo programma
- Il kernel restituisce il controllo alla shell o al sistema operativo
Il codice di uscita 0 indica il successo: il programma è stato completato senza errori. I codici di uscita da 1 a 255 indicano errori diversi. Puoi scegliere qualsiasi numero per segnalare cosa è andato storto.
Perché i codici di uscita sono importanti:
Dopo che il programma termina, la shell (terminale) memorizza il codice di uscita. Puoi verificarlo con:
./myprogram
echo $? ; Prints the exit codeÈ utile per:
- Script che verificano se un programma è terminato correttamente
- Debugging (codici diversi per errori diversi)
- Collegare tra loro i programmi
Un programma minimo completo:
section .text
global _start
_start:
mov rax, 60 ; syscall di uscita
mov rdi, 0 ; codice di uscita 0 (successo)
syscallQuesto programma non fa nulla di visibile. Semplicemente termina correttamente. Ma è un programma valido e completo.
Vediamo cosa sono global _start e _start:.
| Codice | Che cos'è | Perché ti serve |
|---|---|---|
global _start | Indica al linker dove inizia il programma | Senza di esso, il linker non sa quale etichetta sia il punto di ingresso |
_start: | Un'etichetta che segna l'inizio del codice | La CPU inizia l'esecuzione qui |
Non devi memorizzare i dettagli. Ti basta sapere che ogni main.asm deve avere queste due righe prima del tuo codice. Le userai in ogni programma.
Cosa succede se dimentichi la chiamata di sistema exit?
Se non includi la chiamata di sistema exit, la CPU continuerà a eseguire qualsiasi dato spazzatura si trovi in memoria dopo il tuo codice. Questo di solito causa un errore di segmentazione (crash) o un comportamento completamente inaspettato. Il tuo programma non terminerà correttamente.
Termina sempre il tuo programma con una chiamata di sistema di uscita.
Sfida
Aggiungi la syscall di uscita con codice di uscita 5.
Il codice per stampare il messaggio "Exiting with code 5" è già stato fornito. Non è ancora necessario comprenderlo. Verrà trattato nel capitolo 5.
Il tuo compito è solo aggiungere la syscall di uscita alla fine.
Provalo tu
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: Aggiungi la syscall di uscita con codice di uscita 5
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Fondamenti
1La macchina
Che cos’è la CPUMemoriaRegistri vs memoriaCome funzionano le istruzioniSchema a due fileL’architettura x86-642Sistemi numerici
Perché il binario?Numeri binariDa decimale a binarioPerché l'esadecimale?Da esadecimale a decimaleDa decimale a esadecimaleASCII ed esadecimale5Chiamata di sistema di uscita
Cos'è una chiamata di sistema?Chiamata di sistema di uscita (60)Codici di uscitaRiepilogo: uscita correttaEsercitati da solo: Playground Assembly