Chiamata di sistema di uscita (60)
Fa parte della sezione Fondamenti del percorso Assembly di Coddy. Lezione 32 di 45.
La syscall più importante per qualsiasi programma è exit. Senza di essa, il tuo programma continuerebbe a essere eseguito per sempre oppure andrebbe in crash quando raggiunge la fine della memoria.
Il numero della syscall exit è 60.
Sintassi:
mov rax, 60 ; numero di syscall per exit
mov rdi, 0 ; codice di uscita (0 = successo)
syscall ; chiede al sistema operativo di terminare il programmaCosa succede quando esegui syscall con rax = 60:
- La CPU salta nel kernel 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 è stato eseguito correttamente
- Debug (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. Si limita a terminare 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 tuo programma | Senza di esso, il linker non sa quale etichetta sia il punto di ingresso |
_start: | Un'etichetta che indica l'inizio del tuo codice | La CPU inizia a eseguire da 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 syscall di uscita?
Se non includi la syscall di uscita, la CPU continuerà a eseguire i dati spazzatura che si trovano in memoria dopo il tuo codice. Questo di solito causa un errore di segmentazione (crash) o un comportamento del tutto inaspettato. Il tuo programma non terminerà correttamente.
Termina sempre il tuo programma con una syscall di uscita.
Sfida
Aggiungi la chiamata di sistema di uscita con codice di uscita 5.
Il codice per stampare il messaggio "Exiting with code 5" è già fornito. Per ora non devi capirlo. Verrà trattato nel capitolo 5.
Il tuo unico compito è aggiungere la chiamata di sistema 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