Appel système Write (1)
Fait partie de la section Fondamentaux du Journey Assembly de Coddy — leçon 35 sur 45.
Vous savez déjà comment quitter un programme. Mais quitter silencieusement n'est pas très utile. Vous voulez que votre programme affiche une sortie afin que l'utilisateur puisse voir quelque chose.
Pour cela, vous avez besoin de l'appel système write.
Qu'est-ce que l'appel système write ?
L'appel système write indique au système d'exploitation d'afficher du texte à l'écran (ou d'écrire dans un fichier). C'est ainsi que votre programme produit une sortie.
Le numéro de syscall pour write est 1.
Comment fonctionne write :
Contrairement à l'appel système exit (qui ne nécessite qu'un seul argument), write nécessite trois arguments :
| Argument | Registre | Ce qu'il fait | Exemple |
|---|---|---|---|
| Descripteur de fichier | rdi | Où écrire (1 = écran) | mov rdi, 1 |
| Adresse du tampon (buffer) | rsi | Où se trouve le texte en mémoire | mov rsi, message |
| Nombre d'octets | rdx | Combien d'octets à afficher | mov rdx, 13 |
L'appel système write en action :
mov rax, 1 ; numéro de l'appel système pour write
mov rdi, 1 ; descripteur de fichier 1 = stdout (écran)
mov rsi, msg ; adresse de la chaîne à afficher
mov rdx, 13 ; nombre d'octets à afficher
syscall ; demander à l'OS d'afficherPour afficher un message à l'écran, nous avons besoin de 5 lignes. D'abord, nous mettons le numéro de l'appel système 1 dans rax pour l'écriture. Ensuite, nous mettons 1 dans rdi pour dire au système d'exploitation d'afficher à l'écran.
Ensuite, nous plaçons l'adresse de la chaîne (msg) dans rsi. Après cela, nous plaçons le nombre d'octets (13) dans rdx. Enfin, nous exécutons syscall pour demander au système d'exploitation d'afficher.
Ce qui se passe lorsque vous exécutez write :
- Le CPU saute dans le noyau Linux
- Le noyau voit : « write syscall »
- Il lit
rdi(où écrire),rsi(où se trouve le texte) etrdx(combien d'octets)
- Il affiche le texte à l'écran
- Il redonne le contrôle à votre programme
Assembler le tout avec une chaîne de caractères :
section .data
msg db 'Hello', 0x0a ; chaîne avec un saut de ligne
section .text
global _start
_start:
mov rax, 1 ; appel système write
mov rdi, 1 ; stdout
mov rsi, msg ; adresse de la chaîne
mov rdx, 6 ; longueur (Hello + saut de ligne = 6 octets)
syscall
mov rax, 60 ; appel système exit
mov rdi, 0
syscallCe programme affiche Hello puis s'arrête.
Défi
Écrivez un programme qui affiche le message "Hi" suivi d'un saut de ligne. Utilisez l'appel système write.
La chaîne est déjà définie pour vous dans le harnais de test. Vous avez seulement besoin d'écrire la configuration de l'appel système.
Essayez vous-même
section .data
msg db 'Hi', 0x0a
msgLen equ $ - msg
section .text
global _start
_start:
; À FAIRE : Configurer et appeler l'appel système write pour afficher msg
; Utiliser rax=1, rdi=1, rsi=msg, rdx=msgLen
; Quitter le programme
mov rax, 60
mov rdi, 0
syscallCette 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-64