Menu
Coddy logo textTech

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 msg

Ce 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
    syscall
challenge icon

Dé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
    syscall
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Playground Assembly