Repositório dedicado ao estudo e prática de programação em Assembly x86-64, desenvolvido como parte da disciplina de Arquitetura de Computadores. Contém exemplos práticos, exercícios e implementações de algoritmos em baixo nível.
- Sobre o Projeto
- Estrutura do Repositório
- Pré-requisitos
- Instalação
- Como Usar
- Exemplos de Código
- Recursos Adicionais
- Contribuindo
- Licença
Este repositório contém uma coleção abrangente de programas em Assembly x86-64, abordando desde conceitos básicos até implementações mais avançadas. Os códigos foram desenvolvidos utilizando o assembler NASM (Netwide Assembler) e são voltados para sistemas Linux 64-bit.
- Compreender a arquitetura x86-64 e seu conjunto de instruções
- Dominar operações básicas: entrada/saída, aritmética e manipulação de dados
- Implementar estruturas de dados em baixo nível
- Trabalhar com ponto flutuante e operações matemáticas
- Manipular arquivos e gerenciar memória
STUDY-ASSEMBLY/
├── HELLO WORD/ # Primeiro programa: Hello World
├── HELLO WORD + BOM DIA/ # Variações do programa inicial
├── ARITMÉTICA/ # Operações aritméticas básicas
├── INTEIROS E SOMA/ # Trabalho com números inteiros
├── SOMA/ # Exemplos de adição
├── SOMA E INTEIROS/ # Operações combinadas
├── FLOAT/ # Números de ponto flutuante
├── LÊ 2 FLOATS/ # Entrada de números decimais
├── SOMA 2 FLOAT/ # Operações com float
├── ESTRUTURA + SOMA 2 FLOAT/ # Structs e floats
├── ESTRUTURA/ # Estruturas de dados
├── ARRAY/ # Arrays e vetores
├── MATRIZ/ # Matrizes bidimensionais
├── BUBBLESORT/ # Algoritmo de ordenação
├── LINK LIST/ # Listas encadeadas
├── EXPRESSÃO/ # Avaliação de expressões
├── MAXIMO/ # Busca de valores máximos
├── DISTANCIA/ # Cálculos de distância
├── LOCAL/ # Variáveis locais
├── IMPRIME TIPOS/ # Impressão de diferentes tipos
├── IMPRIMI NUMERO/ # Saída numérica
├── ESCREVER E LER ARQUIVO/ # Operações de I/O em arquivos
├── FLUXOGRAMA + FPGA EXECUTANDO/ # Diagramas e implementações
├── PRIMEIROS PROGRAMAS DE ASSEMBLY/ # Códigos iniciais
├── Pratica3/ # Exercícios práticos
├── exemplo11/ # Exemplos numerados
├── exemplo14/
├── exemplo20/
├── SLIDES ASSEMBLY/ # Material de apoio
└── Documentos/
├── Microsoft Word - resumo_assembly.pdf
├── Organização estruturada de computadores - Tanenbaum.pdf
├── assembly64.pdf
└── tabela_chamada_sistema
Antes de começar, certifique-se de ter os seguintes componentes instalados:
- NASM (Netwide Assembler): Assembler para código Assembly
- GCC (GNU Compiler Collection): Para linkedição
- LD (GNU Linker): Vinculador de objetos
- Editor de Texto: Kate, VSCode, Vim ou similar
Linux(recomendado - Ubuntu, Debian, Fedora, etc.)macOS(com adaptações)Windows(via WSL - Windows Subsystem for Linux)
sudo apt update
sudo apt install nasm gcc build-essentialsudo dnf install nasm gccbrew install nasm gccgit clone https://github.com/DebbieMatt/STUDY-ASSEMBLY.git
cd STUDY-ASSEMBLYO processo padrão para compilar e executar programas Assembly segue três etapas:
Converte o código Assembly em código objeto:
nasm -f elf64 -F stabs nome_arquivo.asm -o nome_arquivo.oParâmetros:
-f elf64: Formato de saída ELF 64-bit-F stabs: Inclui informações de debug-o: Especifica o arquivo de saída
Vincula o código objeto criando o executável:
ld -m elf_x86_64 nome_arquivo.o -o nome_arquivoParâmetros:
-m elf_x86_64: Especifica a arquitetura alvo-o: Nome do executável final
Execute o programa compilado:
./nome_arquivo# Navegue até o diretório
cd "HELLO WORD"
# Compile o código
nasm -f elf64 -F stabs hello.asm -o hello.o
# Linkedite
ld -m elf_x86_64 hello.o -o hello
# Execute
./hellosection .data
; Dados inicializados (variáveis globais)
mensagem db 'Hello, World!', 0xA
tamanho equ $ - mensagem
section .bss
; Dados não inicializados (buffer)
buffer resb 64
section .text
global _start
_start:
; Código principal
; Escrever na saída padrão (stdout)
mov rax, 1 ; syscall: write
mov rdi, 1 ; file descriptor: stdout
mov rsi, mensagem ; ponteiro para string
mov rdx, tamanho ; tamanho da string
syscall
; Sair do programa
mov rax, 60 ; syscall: exit
xor rdi, rdi ; código de saída: 0
syscall| Número | Nome | Descrição |
|---|---|---|
| 0 | read | Lê dados de um file descriptor |
| 1 | write | Escreve dados em um file descriptor |
| 2 | open | Abre um arquivo |
| 3 | close | Fecha um file descriptor |
| 60 | exit | Termina o processo |
Para a tabela completa, consulte: Linux System Call Table
- resumo_assembly.pdf: Resumo das instruções e conceitos fundamentais
- assembly64.pdf: Guia completo de Assembly x86-64
- Organização estruturada de computadores - Tanenbaum.pdf: Referência bibliográfica
- tabela_chamada_sistema: Referência rápida de syscalls
- NASM Documentation
- Intel® 64 and IA-32 Architectures Software Developer Manuals
- Linux System Call Table
- x86-64 Assembly Language Programming with Ubuntu
Contribuições são muito bem-vindas! Este projeto pode ser melhorado com novos exemplos, correções e otimizações.
- Fork este repositório
- Crie uma branch para sua feature:
git checkout -b feature/minha-contribuicao
- Commit suas mudanças:
git commit -m 'feat: adiciona exemplo de recursão' - Push para a branch:
git push origin feature/minha-contribuicao
- Abra um Pull Request
- Siga o padrão de nomenclatura existente
- Comente seu código adequadamente
- Inclua exemplos de uso quando aplicável
- Teste seus programas antes de submeter
- Atualize a documentação se necessário
Para mais detalhes, veja CONTRIBUTING.md
|
Débora Mateus |
Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.
Desenvolvido com 💙 por Débora Mateus