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 chamada de sistema write, depois de informar ao sistema operacional para onde enviar a saída (descritor de arquivo em rdi), você precisa informar 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 armazena dados. No nosso caso, o buffer é a string que queremos imprimir.

Por que address, e não o valor em si?

O syscall write precisa saber onde a string começa na memória. Ele lerá bytes a partir desse address até atingir o comprimento que você especificar em rdx. Você não envia os caracteres reais para o 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 rótulo. 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, está colocando esse número de endereço em rsi.

O que acontece se você esquecer o address?

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

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          ; saída padrão
    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 somente 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á tem 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

Pratique por conta própria: Playground de Assembly