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 chamada de sistema write.
O que é a chamada de sistema write?
A chamada de sistema write informa ao sistema operacional para imprimir texto na tela (ou gravá-lo em um arquivo). É assim que seu programa produz uma saída.
O número da syscall para write é 1.
Como write funciona:
Diferentemente da chamada de sistema exit (que precisa de apenas um argumento), write precisa de três argumentos:
| Argumento | Registrador | O que ele faz | Exemplo |
|---|---|---|---|
| Descritor de arquivo | rdi | Onde escrever (1 = tela) | mov rdi, 1 |
| Endereço do buffer | rsi | Onde o texto está na memória | mov rsi, message |
| Quantidade de bytes | rdx | Quantos bytes imprimir | mov rdx, 13 |
A syscall 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 a imprimir
mov rdx, 13 ; número de bytes a imprimir
syscall ; pede ao SO para imprimirPara imprimir uma mensagem na tela, precisamos de 5 linhas. Primeiro, colocamos o número de syscall 1 em rax para write. Em seguida, colocamos 1 em rdi para informar ao sistema operacional que deve 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:
- A CPU salta para o kernel do Linux
- O kernel vê: "write syscall"
- Ele lê
rdi(onde escrever),rsi(onde o texto está) erdx(quantos bytes)
- Ele imprime o texto na tela
- 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
syscallEste programa imprime Hello e depois encerra.
Desafio
Escreva um programa que imprima a mensagem "Hi" seguida por uma nova linha. Use a chamada de sistema write.
A string já está definida para você no ambiente de testes. Você só precisa escrever a configuração da chamada de sistema.
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
syscallEsta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Fundamentos
1A Máquina
O que é CPUMemóriaRegistradores vs MemóriaComo as instruções funcionamPadrão de Dois ArquivosA Arquitetura x86-64Pratique por conta própria: Playground de Assembly