Menu
CoddyTech

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), vous devez lui indiquer quoi afficher. Pour cela, vous lui transmettez l’adresse de la chaîne en mémoire.

Le registre de 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 tu indiques dans rdx. Tu n’envoies pas les caractères eux-mêmes à l’appel système. Tu envoies leur emplacement.

Exemple :

section .data
    msg db 'Hello', 0x0a

section .text
    mov rsi, msg        ; rsi contient l'adresse de msg

Ce que msg représente 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. Quand tu écris mov rsi, msg, tu places 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 dont la valeur est '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
    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