Syscall Exit (60)
Parte da seção Fundamentos do Journey de Assembly da Coddy. Lição 32 de 45.
A chamada de sistema mais importante para qualquer programa é exit. Sem ela, seu programa continuaria em execução para sempre ou travaria ao chegar ao fim da memória.
O número da chamada de sistema 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 sistema operacional que encerre o programaO que acontece quando você executa syscall com rax = 60:
- 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 ao 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 diferentes erros. Você pode escolher qualquer número para sinalizar o que deu errado.
Por que os códigos de saída são importantes:
Depois que seu programa é encerrado, o shell (terminal) armazena o código de saída. Você pode verificá-lo com:
./myprogram
echo $? ; Prints the exit codeIsso é útil para:
- Scripts que verificam se um programa foi executado com sucesso
- Depuração (códigos diferentes para erros diferentes)
- Encadear programas
Um programa mínimo completo:
section .text
global _start
_start:
mov rax, 60 ; chamada de sistema de saída
mov rdi, 0 ; código de saída 0 (sucesso)
syscallEste programa não faz nada visível. Ele simplesmente termina com sucesso. Mas é um programa válido e completo.
Vamos mencionar o que são global _start e _start:.
| 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 executar aqui |
Você não precisa memorizar os detalhes. Basta saber que todo main.asm precisa ter estas duas linhas antes do seu código. Você as usará em todos os programas.
O que acontece se você esquecer a chamada de sistema exit?
Se você não incluir a chamada de sistema exit, a CPU continuará executando quaisquer dados sem sentido que estiverem na memória após o seu código. Isso geralmente causa uma falha de segmentação (travamento) ou um comportamento completamente inesperado. Seu programa não terminará corretamente.
Sempre encerre seu programa com uma chamada de sistema de saída.
Desafio
Adicione a chamada de sistema 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. Você ainda não precisa entendê-lo. Esse conteúdo será abordado no Capítulo 5.
Sua única tarefa é adicionar a chamada de sistema de saída no 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: Adicione a syscall de saída com 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-64Pratique por conta própria: Playground de Assembly