Menu
CoddyTech

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 programma

Cosa succede quando esegui syscall con rax = 60:

  1. La CPU salta nel kernel Linux
  2. Il kernel vede: "exit syscall with code 0"
  1. Il kernel termina il tuo programma
  2. 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)
    syscall

Questo programma non fa nulla di visibile. Si limita a terminare correttamente. Ma è un programma valido e completo.

Vediamo cosa sono global _start e _start:.

CodiceChe cos'èPerché ti serve
global _startIndica al linker dove inizia il tuo programmaSenza di esso, il linker non sa quale etichetta sia il punto di ingresso
_start:Un'etichetta che indica l'inizio del tuo codiceLa 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.

challenge icon

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
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fondamenti

Esercitati da solo: Playground Assembly