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

Pratique por conta própria: Playground de Assembly