Syscall Exit (60)
Fait partie de la section Fondamentaux du Journey Assembly de Coddy. Leçon 32 sur 45.
L’appel système le plus important pour tout programme est exit. Sans lui, votre programme continuerait à s’exécuter indéfiniment ou planterait lorsqu’il atteindrait la fin de la mémoire.
Le numéro de l’appel système exit est 60.
Syntaxe :
mov rax, 60 ; numéro de syscall pour exit
mov rdi, 0 ; code de sortie (0 = succès)
syscall ; demande au système d’exploitation de quitter le programmeQue se passe-t-il lorsque vous exécutez syscall avec rax = 60 :
- Le CPU passe dans le noyau Linux
- Le noyau voit : « appel système exit avec le code 0 »
- Le noyau termine votre programme
- Le noyau rend le contrôle au shell ou au système d’exploitation
Le code de sortie 0 signifie la réussite : le programme s’est terminé sans erreur. Les codes de sortie de 1 à 255 indiquent différentes erreurs. Vous pouvez choisir n’importe quel nombre pour signaler ce qui s’est mal passé.
Pourquoi les codes de sortie sont importants :
Lorsque votre programme se termine, le shell (terminal) enregistre le code de sortie. Vous pouvez le vérifier avec :
./myprogram
echo $? ; Prints the exit codeCela est utile pour :
- Les scripts qui vérifient si un programme a réussi
- Le débogage (différents codes pour différentes erreurs)
- L’enchaînement de programmes
Un programme minimal complet :
section .text
global _start
_start:
mov rax, 60 ; appel système de sortie
mov rdi, 0 ; code de sortie 0 (succès)
syscallCe programme ne fait rien de visible. Il se termine simplement avec succès. Mais c'est un programme valide et complet.
Mentionnons ce que global _start et _start: sont.
| Code | Ce que c’est | Pourquoi vous en avez besoin |
|---|---|---|
global _start | Indique à l’éditeur de liens où commence votre programme | Sans cela, l’éditeur de liens ne sait pas quelle étiquette est le point d’entrée |
_start: | Une étiquette qui marque le début de votre code | Le CPU commence l’exécution ici |
Tu n’as pas besoin de mémoriser les détails. Sache simplement que chaque main.asm doit contenir ces deux lignes avant ton code. Tu les utiliseras dans chaque programme.
Que se passe-t-il si vous oubliez l’appel système de sortie ?
Si vous n’incluez pas l’appel système de sortie, le CPU continuera d’exécuter les données indésirables qui se trouvent en mémoire après votre code. Cela provoque généralement une erreur de segmentation (plantage) ou un comportement totalement inattendu. Votre programme ne se terminera pas proprement.
Terminez toujours votre programme par un appel système de sortie.
Défi
Ajoutez l’appel système de sortie avec le code de sortie 5.
Le code permettant d’afficher le message "Exiting with code 5" vous est déjà fourni. Vous n’avez pas encore besoin de le comprendre. Il sera abordé au chapitre 5.
Votre seule tâche consiste à ajouter l’appel système de sortie à la fin.
Essayez vous-même
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: Ajouter l'appel système de sortie avec le code de sortie 5
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Fondamentaux
1La Machine
Qu'est-ce qu'un CPULa mémoireRegistres vs MémoireFonctionnement des instructionsLe modèle à deux fichiersL'architecture x86-64Entraînez-vous par vous-même : Playground Assembly