Juntando Tudo
Parte da seção Fundamentos do Journey de Assembly da Coddy — lição 39 de 45.
Você aprendeu todas as quatro partes da syscall write:
| Registrador | O que ele contém | Valor para saída na tela |
|---|---|---|
rax | Número da syscall | 1 (write) |
rdi | Descritor de arquivo | 1 (stdout) |
rsi | Endereço do buffer | Endereço da sua string |
rdx | Contagem de bytes | Comprimento da sua string |
Agora é hora de juntar tudo.
O padrão completo da syscall write:
mov rax, 1 ; número da syscall para write
mov rdi, 1 ; descritor de arquivo (stdout)
mov rsi, msg ; endereço da string
mov rdx, msgLen ; número de bytes para imprimir
syscall ; solicita ao SO para imprimirUm programa completo e funcional:
section .data
msg db 'Hello, World!', 0x0a
msgLen equ $ - msg
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msgLen
syscall
mov rax, 60
mov rdi, 0
syscallO que este programa faz:
| Passo | O que acontece |
|---|---|
| 1 | Imprime "Hello, World!" na tela |
| 2 | Move para uma nova linha |
| 3 | Encerra corretamente com o código 0 |
A ordem importa:
Você deve configurar os registradores antes de executar syscall. A ordem das instruções mov não importa, desde que todas as quatro estejam configuradas antes de syscall.
Desafio
Escreva um programa completo que imprima a mensagem "Assembly is fun" seguida por uma nova linha, e então saia de forma limpa.
A string e seu comprimento já estão definidos. Você só precisa escrever o código dentro de _start:.
Experimente você mesmo
section .data
msg db 'Assembly is fun', 0x0a
msgLen equ $ - msg
section .text
global _start
_start:
; TODO: Configurar e chamar a syscall write
; Use rax=1, rdi=1, rsi=msg, rdx=msgLen
; TODO: Sair de forma limpa com o código 0Esta 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