Montadores (assemblers) traduzem assembly para código de máquina. A maioria é duas passagens. Um montador de três passagens adiciona terceira travessia para desbloquear capacidades que duas não lidam limpo — especialmente carregamento absoluto, relocação, e resolução complexa de símbolos.
Saída: Arquivo objeto relocável (precisa linker/loader).
Terceira passagem atribui endereços absolutos finais a cada instrução e dado. Saída é binário carrega-e-roda — sem linker, sem etapa relocação. Loader só copia pro endereço especificado e salta pro entry point. Crítico para:
Passagem 2 resolve símbolos para offsets relativos (pra relocação). Passagem 3 resolve para endereços finais. Toda referência externa, forward reference, e expressão complexa ganha valor concreto. Permite:
Montadores três passagens podem emitir código objeto relocável e módulos absolutos. Terceira passagem constrói tabelas relocação (quais endereços precisam fix no load) enquanto também produz versão absoluta. Flexibilidade pra ambos workflows.
Passagem 1: Coleta. Passagem 2: Resolve. Passagem 3: Otimiza — hash tables, perfect hashing, eliminação símbolos mortos, particionamento por escopo. Montagem mais rápida pra projetos grandes (pense kernels OS, firmware blobs).
Com três fases distintas, erros pegos em contexto:
Resultado: linha/coluna precisa + mensagem acionável, não "erro na passagem 2".
Toolchains produção (GAS, LLVM-MC, NASM) são duas-passagens + linker. Linker faz o que passagem 3 faria: atribuição endereço final, processamento relocação, dead stripping. Montadores três passagens sobrevivem em nichos onde overhead linker é indesejado ou impossível.
Montadores três passagens trocam complexidade por saída absoluta auto-contida, diagnósticos ricos, e flexibilidade relocação. Não são "melhores" — são especializados. Se escreve bootloader pra microcontrolador com load address fixo 0x08000000, montador três passagens economiza linker script. Pra quase tudo mais, duas-passagens + linker é padrão.
Tecnologia Eletrônica © [www.351231.com]