Adresse du buffer (rsi)
Fait partie de la section Fondamentaux du Journey Assembly de Coddy. Leçon 37 sur 45.
Dans l’appel système write, après avoir indiqué au système d’exploitation où envoyer la sortie (le descripteur de fichier dans rdi), tu dois lui indiquer quoi afficher. Pour cela, tu lui transmets l’address de la chaîne en mémoire.
Le registre contenant l’adresse du tampon est rsi.
Qu’est-ce qu’un tampon ?
Un tampon est simplement un bloc de mémoire qui contient des données. Dans notre cas, le tampon est la chaîne que nous voulons afficher.
Pourquoi l’adresse, et non la valeur elle-même ?
L’appel système write doit savoir où la chaîne commence en mémoire. Il lira les octets à partir de cette adresse jusqu’à atteindre la longueur que vous spécifiez dans rdx. Vous n’envoyez pas les caractères eux-mêmes à l’appel système. Vous envoyez leur emplacement.
Exemple :
section .data
msg db 'Hello', 0x0a
section .text
mov rsi, msg ; rsi contient l'adresse de msgCe qu’est réellement <strong>msg</strong> :
msg est une étiquette. L’assembleur la remplace par un nombre : l’adresse mémoire où la chaîne 'Hello' est stockée. Lorsque vous écrivez mov rsi, msg, vous placez ce nombre d’adresse dans rsi.
Que se passe-t-il si vous oubliez l’adresse ?
Si vous ne définissez pas rsi, le registre contient les données indésirables qui s’y trouvaient auparavant. Le système d’exploitation essaiera de lire à partir d’une adresse mémoire aléatoire, ce qui provoquera probablement une erreur de segmentation (plantage).
Exemple complet avec l’appel système write :
section .data
msg db 'Hello', 0x0a
len equ $ - msg
section .text
mov rax, 1 ; appel système write
mov rdi, 1 ; stdout
mov rsi, msg ; adresse de la chaîne
mov rdx, len ; nombre d'octets
syscallDéfi
On vous donne une chaîne appelée greeting avec la valeur 'Hi' suivie d’un saut de ligne. Écrivez la ligne de code qui charge l’adresse de greeting dans rsi.
Écrivez uniquement l’instruction mov pour rsi.
Essayez vous-même
section .text
global _start
_start:
%include "solution.asm"
mov rax, 1
mov rdi, 1
; rsi a déjà l'adresse (du code de l'étudiant)
mov rdx, greetingLen
syscall
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-64Entraînez-vous par vous-même : Playground Assembly