Syscall Exit (60)
Parte da seção Fundamentos do Journey de Assembly da Coddy — lição 32 de 45.
A syscall mais importante para qualquer programa é exit. Sem ela, seu programa continuaria rodando para sempre ou travaria ao chegar ao fim da memória.
O número da syscall exit é 60.
Sintaxe:
mov rax, 60 ; número da syscall para exit
mov rdi, 0 ; código de saída (0 = sucesso)
syscall ; solicita ao SO para sairO que acontece quando você executa <strong>syscall</strong> com <strong>rax = 60</strong>:
- A CPU salta para o kernel do Linux
- O kernel vê: "chamada de sistema exit com código 0"
- O kernel encerra seu programa
- O kernel devolve o controle ao shell ou sistema operacional
O código de saída 0 significa sucesso — o programa foi concluído sem erros. Os códigos de saída de 1 a 255 indicam erros diferentes. Você pode escolher qualquer número para sinalizar o que deu errado.
Por que os códigos de saída importam:
Depois que seu programa termina, o shell (terminal) armazena o código de saída. Você pode verificá-lo com:
./myprogram
echo $? ; Imprime o código de saídaIsso é útil para:
- Scripts que verificam se um programa teve sucesso
- Depuração (códigos diferentes para erros diferentes)
- Encadeamento de programas
Um programa mínimo completo:
section .text
global _start
_start:
mov rax, 60 ; syscall de saída
mov rdi, 0 ; código de saída 0 (sucesso)
syscallEste programa não faz nada visível — ele apenas sai com sucesso. Mas é um programa válido e completo.
Vamos mencionar o que global _start e _start: são.
| Código | O que é | Por que você precisa disso |
|---|---|---|
global _start | Informa ao linker onde seu programa começa | Sem isso, o linker não sabe qual rótulo é o ponto de entrada |
_start: | Um rótulo que marca o início do seu código | A CPU começa a execução aqui |
Você não precisa memorizar os detalhes. Apenas saiba que todo main.asm deve ter estas duas linhas antes do seu código. Você as usará em todos os programas.
O que acontece se você esquecer a syscall exit?
Se você não incluir a syscall exit, a CPU continuará executando quaisquer dados inúteis (garbage data) que estiverem na memória após o seu código. Isso geralmente causa uma falha de segmentação (segmentation fault/crash) ou um comportamento completamente inesperado. Seu programa não terminará de forma limpa.
Sempre encerre seu programa com uma syscall exit.
Desafio
Adicione a syscall de saída com o código de saída 5.
O código para imprimir a mensagem "Exiting with code 5" já foi fornecido para você. Você não precisa entendê-lo ainda — ele será abordado no Capítulo 5.
Seu trabalho é apenas adicionar a syscall de saída ao final.
Experimente você mesmo
section .data
msg db 'Exiting with code 5', 0x0a
msgLen equ $ - msg
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msgLen
syscall
; TODO: Adicionar a syscall de saída com o código de saída 5
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
1A Máquina
O que é CPUMemóriaRegistradores vs MemóriaComo as instruções funcionamPadrão de Dois ArquivosA Arquitetura x86-64