Projeto modular em Assembly (NASM) para Linux x86_64, utilizando chamadas diretas ao kernel via syscall, sem dependência de libc.
Implementar um contador interativo que:
- Lê um número decimal via
stdin - Converte ASCII → inteiro
- Incrementa o valor em 1
- Converte inteiro → ASCII
- Exibe o resultado via
stdout
O foco é controle explícito de registradores, ABI e fluxo de execução.
-
main.asm
Orquestra o fluxo do programa. -
io.asm
Implementa abstrações mínimas parareadewrite. -
convert.asm
Contématoi(ASCII → inteiro) eitoa(inteiro → ASCII). -
constants.asm
Define mensagens e buffers. -
syscalls.inc
Define números simbólicos das syscalls.
Arquitetura alvo: x86_64
Sistema operacional: Linux
Formato do executável: ELF64
Ponto de entrada: _start
Runtime C: inexistente
Syscalls utilizadas:
SYS_READ(0)SYS_WRITE(1)SYS_EXIT(60)
Todas as interações com o sistema são feitas via instrução syscall.
ABI utilizada: System V AMD64
Argumentos:
rdirsirdxrcxr8r9
Retorno:
rax
Caller-saved:
rax,rcx,rdx,rsi,rdi,r8–r11
Este projeto não preserva registradores callee-saved, pois não há interoperabilidade com código externo.
Para cada caractere:
- Subtrai
'0' - Multiplica acumulador por 10
- Soma o dígito
Complexidade: O(n)
- Divide sucessivamente por 10
- Armazena restos na pilha
- Reverte ordem ao desempilhar
Complexidade: O(log₁₀ n)
nasm -f elf64 src/main.asm -o main.o
nasm -f elf64 src/io.asm -o io.o
nasm -f elf64 src/convert.asm -o convert.o
nasm -f elf64 src/constants.asm -o constants.o
ld main.o io.o convert.o constants.o -o contador