Menu
Coddy logo textTech

Syscall Write (1)

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

Você já sabe como sair de um programa. Mas sair silenciosamente não é muito útil. Você quer que seu programa imprima uma saída para que o usuário possa ver algo.

Para isso, você precisa da syscall write.

O que é a syscall write?

A syscall write diz ao sistema operacional para imprimir texto na tela (ou gravar em um arquivo). É assim que seu programa produz saída.

O número da syscall para write é 1.

Como o write funciona:

Ao contrário da syscall exit (que precisa de apenas um argumento), o write precisa de três argumentos:

ArgumentoRegistradorO que fazExemplo
Descritor de arquivordiOnde escrever (1 = tela)mov rdi, 1
Endereço do bufferrsiOnde o texto está na memóriamov rsi, message
Contagem de bytesrdxQuantos bytes imprimirmov rdx, 13

A chamada de sistema write em ação:

mov rax, 1      ; número da syscall para write
mov rdi, 1      ; descritor de arquivo 1 = stdout (tela)
mov rsi, msg    ; endereço da string para imprimir
mov rdx, 13     ; número de bytes para imprimir
syscall         ; solicita ao SO para imprimir

Para imprimir uma mensagem na tela, precisamos de 5 linhas. Primeiro, colocamos o número da syscall 1 em rax para escrita. Depois, colocamos 1 em rdi para dizer ao SO para imprimir na tela.

Em seguida, colocamos o endereço da string (msg) em rsi. Depois disso, colocamos o número de bytes (13) em rdx. Finalmente, executamos syscall para solicitar que o SO realize a impressão.

O que acontece quando você executa write:

  1. A CPU salta para o kernel do Linux
  2. O kernel vê: "write syscall"
  3. Ele lê rdi (onde escrever), rsi (onde o texto está) e rdx (quantos bytes)
  1. Ele imprime o texto na tela
  2. Ele retorna o controle para o seu programa

Juntando tudo com uma string:

section .data
    msg db 'Hello', 0x0a    ; string com nova linha

section .text
    global _start

_start:
    mov rax, 1              ; syscall write
    mov rdi, 1              ; stdout
    mov rsi, msg            ; endereço da string
    mov rdx, 6              ; comprimento (Hello + nova linha = 6 bytes)
    syscall

    mov rax, 60             ; syscall exit
    mov rdi, 0
    syscall

Este programa imprime Hello e depois encerra.

challenge icon

Desafio

Escreva um programa que imprima a mensagem "Hi" seguida de uma nova linha. Use a syscall "write".

A string já está definida para você no ambiente de teste. Você só precisa escrever a configuração da syscall.

Experimente você mesmo

section .data
    msg db 'Hi', 0x0a
    msgLen equ $ - msg

section .text
    global _start

_start:
    ; TODO: Configurar e chamar a syscall write para imprimir msg
    ; Use rax=1, rdi=1, rsi=msg, rdx=msgLen

    ; Sair do programa
    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