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 (descripteur de fichier dans rdi), vous devez lui indiquer ce qu'il faut imprimer. Vous faites cela en passant l'adresse de la chaîne de caractères en mémoire.
Le registre pour l'adresse du tampon est rsi.
Qu'est-ce qu'un buffer ?
Un buffer est simplement un bloc de mémoire qui contient des données. Dans notre cas, le buffer est la chaîne de caractères que nous voulons imprimer.
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'à ce qu'il atteigne la longueur que vous spécifiez dans rdx. Vous n'envoyez pas les caractères réels à 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 que <strong>msg</strong> est réellement :
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 numéro d'adresse dans rsi.
Que se passe-t-il si vous oubliez l'adresse ?
Si vous ne définissez pas rsi, le registre contiendra les données résiduelles qui s'y trouvaient auparavant. L'OS tentera de lire à partir d'une adresse mémoire aléatoire, ce qui provoquera probablement une erreur de segmentation (crash).
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 de caractères nommé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 contient déjà l'adresse (provenant 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-64