Menu
Coddy logo textTech

Endereço do Buffer (rsi)

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

Na syscall write, após informar ao SO para onde enviar a saída (descritor de arquivo em rdi), você precisa dizer a ele o que imprimir. Você faz isso passando o endereço da string na memória.

O registrador para o endereço do buffer é rsi.

O que é um buffer?

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

Por que o endereço, e não o valor em si?

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

Exemplo:

section .data
    msg db 'Hello', 0x0a

section .text
    mov rsi, msg        ; rsi contém o endereço de msg

O que <strong>msg</strong> realmente é:

msg é um label. O assembler o substitui por um número — o endereço de memória onde a string 'Hello' está armazenada. Quando você escreve mov rsi, msg, você 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 lixo que estivesse lá antes. O SO tentará ler de um endereço de memória aleatório, o que provavelmente causará uma falha de segmentação (crash).

Exemplo completo com a syscall write:

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

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

Desafio

Você recebeu uma string chamada greeting com o valor 'Hi' seguida 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 estudante)
    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