Menu
CoddyTech

Endereço do Buffer (rsi)

Parte da seção Fundamentos do Journey de Assembly da Coddy. Lição 37 de 45.

Na chamada de sistema write, depois de informar ao SO para onde enviar a saída (descritor de arquivo em rdi), você precisa informar o que imprimir. Para isso, passe o endereço da string na memória.

O registrador do endereço do buffer é rsi.

O que é um buffer?

Um buffer é simplesmente um bloco de memória que armazena dados. No nosso caso, o buffer é a string que queremos imprimir.

Por que o endereço, e não o próprio valor?

A chamada de sistema write precisa saber onde a string começa na memória. Ela lerá bytes a partir desse endereço até atingir o tamanho que você especificar em rdx. Você não envia os caracteres propriamente ditos para a chamada de sistema. Você envia a localização deles.

Exemplo:

section .data
    msg db 'Hello', 0x0a

section .text
    mov rsi, msg        ; rsi armazena o endereço de msg

O que msg realmente é:

msg é um rótulo. O montador o substitui por um número: o endereço de memória onde a string 'Hello' está armazenada. Quando você escreve mov rsi, msg, está colocando esse número de endereço em rsi.

O que acontece se você esquecer o endereço?

Se você não definir rsi, o registrador conterá qualquer valor lixo que estivesse lá antes. O sistema operacional tentará ler de um endereço de memória aleatório, o que provavelmente causará uma falha de segmentação (travamento).

Exemplo completo com a chamada de sistema write:

section .data
    msg db 'Hello', 0x0a
    len equ $ - msg

section .text
    mov rax, 1          ; chamada de sistema write
    mov rdi, 1          ; stdout
    mov rsi, msg        ; endereço da string
    mov rdx, len        ; número de bytes
    syscall
challenge icon

Desafio

Você recebe uma string chamada greeting com o valor 'Hi' seguido por uma nova linha. Escreva a linha de código que carrega o endereço de greeting em rsi.

Escreva apenas a instrução mov para rsi.

Experimente você mesmo

section .text
    global _start

_start:
    %include "solution.asm"
    
    mov rax, 1
    mov rdi, 1
    ; rsi já contém o endereço (do código do aluno)
    mov rdx, greetingLen
    syscall

    mov rax, 60
    mov rdi, 0
    syscall
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Fundamentos

Pratique por conta própria: Playground de Assembly