Este relatorio descreve a versao atual e funcional do projeto, incluindo parser/lexer, assembler em duas passagens, executor modularizado e testes de ponta a ponta.
O projeto foi organizado em modulos independentes:
lexer/: tokenizacao da linguagem de expressoes.parser/: analise sintatica e geracao de assembly da máquina Neander.assembler/: traducao de assembly para arquivo.mem.executor/: simulador da CPU Neander (fetch/decode/execute).shared/etypes/: tipos e includes compartilhados.examples/: arquivos*.exprde exemplos
Todos os Makefile foram ajustados para compilar com includes da raiz (-I..) e para encadear corretamente os modulos.
O assembler em assembler/assembler.c funciona em duas passagens.
- Le as linhas do arquivo assembly.
- Remove comentarios e separa
label,instrucaoeoperando. - Monta a tabela de simbolos (
struct Label) com deteccao de rótulo duplicado. - Calcula enderecos considerando:
- 1 byte para instrucoes sem operando.
- 2 bytes para instrucoes com operando.
- diretivas
ORG,DATAeSPACE.
- Relê o arquivo.
- Resolve cada mnemônico para opcode.
- Resolve operandos numericos e labels.
- Gera memoria de 256 bytes.
- Escreve arquivo
.memcom cabecalho03 4E 44 52(NDR) e bytes em pares (baixo + padding0x00).
Mnemônicos implementados: NOP, STA, LDA, ADD, OR, AND, NOT, JMP, JN, JZ, HLT.
Diretivas implementadas: ORG, DATA, SPACE.
O lexer (lexer/lexer.c) reconhece:
- identificadores / variaveis
- numeros inteiros
- operadores
=,+,-,*,|,&,~ - parenteses
- palavras reservadas logicas
OR,AND,NOT
Foi incluído um lexer/main.c para teste isolado do modulo.
O parser (parser/parser.c) faz parse de atribuicoes e expressoes com precedencia:
parse_expr_or->parse_expr_and->parse_expr_add->parse_expr_mul->parse_factor
Operacoes geradas:
- Soma:
ADD - Subtracao: complemento de dois (
NOT,ADD CONST_1,ADD) - Multiplicacao: loop por somas sucessivas, usando labels temporarios
- Atribuicao de variaveis:
STA <variavel>
Otimizacao de memoria aplicada:
- Literais sao registrados como constantes reutilizaveis (
CONST_x) para evitar duplicacao. - Variaveis nao sao duplicadas na tabela de simbolos interna.
executor/memory_image.h/.c: abstracao da memoria de 256 bytes.executor/loader.h/.c: carregamento de.mem(cabecalho NDR e formato em pares).executor/cpu.h/.c: estado da CPU e funcao de passo (cpu_step).executor/ui.h/.c: interface textual interativa no terminal (painel passo a passo).executor/main.c: CLI, loop de execucao, modos--trace,--step,--uie limite--max-steps.
AC,PCeIR- flags
NeZ
Em cada cpu_step:
- Fetch do opcode em
PC. - Decode (le operando quando necessario).
- Execute da instrucao.
- Atualizacao de
NeZpara operacoes que alteramAC.
Ao final da execucao, o programa imprime estado final da CPU e dump da memoria nao nula.
No modo interativo (--step, com --ui habilitado automaticamente), o executor:
- renderiza a interface, espera Enter e so entao executa a proxima instrucao;
- limpa a tela antes de redesenhar o painel (Windows:
cls, Unix/macOS:clear); - mostra registradores e flags (
PC,AC,IR,N,Z); - mostra a linha/endereco atual da execucao;
- mostra instrucao atual/proxima e ultima instrucao executada;
- mostra a tabela de mnemônicos e opcodes;
- mostra a memoria decodificada, com destaque da linha corrente (
>>).
- Makefile raiz compila
lexer,assembler,parsereexecutor. cleanchamacleande cada submodulo e remove apenas artefatos gerados*.asme*.mem.