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:
| Argumento | Registrador | O que 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 |
| Contagem de bytes | rdx | Quantos bytes imprimir | mov 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 imprimirPara 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:
- 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 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
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-64