Você está na página 1de 30

Arquitetura de Computadores I

Montadores, Ligadores e Carregadores

Edson Moreno

edson.moreno@pucrs.br
http://www.inf.pucrs.br/~emoreno
Visão geral
 Fluxo da construção até a execução de um programa
 Compiladores
 Responsável pela tradução de um programa descrito em linguagem de
alto nível para
 Montadores (assembler)
 Responsáveis pela tradução do programa escrito em linguagem assembly
 Resultado é um programa em linguagem de máquina
 Ligadores (linker / Link-editor)
 Responsável por unir diferentes partes de um programa
 Permite modularizar o desenvolvimento de um programa
 Carregadores (loader)
 Responsável pela transferência de um programa para a MP
Proposta de uso dos mecanismos
 Arquitetura
 Montador e Carregador integrados

Montador
Código Fonte / Memória
Carregador
Proposta de uso dos mecanismos
 Arquitetura
 Montador e Carregador independentes

Código Fonte Montador Memória

Carregador
Executável
(SO)
Proposta de uso dos mecanismos
 Arquitetura
 Montador, Ligador e Carregador independentes

Módulo A Módulo B Módulo Z

Montador Montador Montador

Objeto A Objeto B Objeto C

Ligador

Carregador
Executável Memória
SO
Máquina hipotética
 Arquitetura
 Acumulador (16bits)
 PC (16 bits)
 Memória de 216 palavras de 16bits
 3 formatos de instrução
Conjunto de instruções
Montador (Assembler)
 Função
 Traduzir programas escritos em linguagem de montagem
(assembly) para linguagem de máquina
Conceitos básicos
 Sintaxe típica de programas de montagem
 [rótulo] [operação] [operando1] [, operando2] ; comentário

 Rótulo
 Marcador empregado para definir um endereço da área de código

 Operação
 Opcodes simbólicos: mnemônico que representa uma instrução
 Pseudo instrução: Operação que orienta a atuação do montador

 Operandos
 Registradores, constantes ou endereços de memória
Montador
 Função básica
 Substituir Opcodes / mnemônicos por instruções opcodes numéricos
 Segue uma tabela de associações
 Relaciona o mnemonico com a instrução alvo

 Substituir endereços simbólicos por endereços numéricos


 Jumps / branches (endereço absoluto ou deslocamento relativo ao pc)
 Constantes (valor associado ao ponto do código)

 Reserva espaço para dados


 De acordo com o tipo associado a cada variável

 Geram constantes em memória


 Variáveis e constantes (valor associado ao modo de endereçamento do operando)
Algoritmos
 Duas passagens
 Realiza duas passagens no arquivo fonte
 Primeira passagem
 Reconhece símbolos definidos pelo programador
o Constrói tabela com símbolos e seus respectivos valores
 Segunda passagem
 Geração do código objeto

 Estrutura de dados empregada


 Tabela de instruções
 Tabela de diretivas
 Tabela de símbolos
 Contador de posições
Primeira passagem
Segunda passagem
Ligadores (Linker)
 Função
 Juntar diferentes arquivos objeto
 Gerar um arquivo executável a partir dos objetos
 Para isto, deve:
 Resolver referências cruzadas
Processo de montagem
 Características
 Módulos montados de forma independente
 Podem ser bibliotecas de funções
 Podem fazer uso de funções cujo código não é conhecido

 Referência cruzada / não resolvida


 Símbolos não conhecidos dentro de um módulo
 Montador deve informar este tipo de situação
 Cria tabela de uso
 Situações devem ser tratadas posteriormente
Tabela de uso
 Inserida pelo montador no código objeto gerado

 Indica
 Símbolos externos que foram utilizados pelo módulo
 Onde foram referenciados

 Ligador
 Utiliza informações para correções necessárias
 Deve conhecer o formato do arquivo objeto
Problema
 Uma referência não resolvida é um erro?
 Para o algoritmo básico do montador sim
 Mas pode não ser...

 O que fazer?
 Considerar todas as referências não resolvidas
 Desvantagem é que um erro de montagem somente é detectado na ligação
 Incluir diretivas de montagem
 Obrigam o programador a declarar explicitamente o que está fazendo o
símbolo
Diretivas
 EXTERN

 Programador informa quais referências pertencem a outro módulo


 Diferencia “símbolo não conhecido” de “símbolo não definido”

 Símbolos declarados como EXTERN vão para tabela de uso

 Localidade dos símbolos


 Locais – Símbolo local ao módulo em que foi definido
 Global – Quando definido em um módulo e empregado em outro
 Obrigatória sinalização com uma diretiva
o Nesta arquitetura hipotética, utiliza-se a diretiva PUBLIC
o No MARS, emprega-se .GLOBL
Diretivas
 PUBLIC
 Programador informa símbolos a serem exportados

 Símbolo definido localmente mas com escopo global

 Resultado é uma tabela de definições


 Subconjunto da tabela de símbolos
 Incluída no arquivo objeto
Novo algoritmo
 Alteração do algoritmo básico
 Tabela de símbolos
 Deve conter a informação se um símbolo é local ou global
 Tratamento de diretivas
 Primeira passagem
 Insere símbolo na tabela de uso (EXTERN)
 Segunda passagem
 Insere símbolo na tabela de definições (PUBLIC)
 Arquivo objeto
 Devem conter informações das tabelas de símbolo e de definições
 Tratamento de erro
 Redefinição de símbolos (locais e globais devem ter nomes distintos)
 Símbolos exportados mas não definidos
 Símbolo externo foi exportado
Geração dos módulos
Módulo A
Módulo B
Exemplo MARS
Configuração necessária:
1. Salve os arquivos no mesmo diretório
2. Habilite a opção Settings >> Assembly all file in directory

#MAIN.ASM #FUNC.ASM
.text .text
main:
li $v0 ,5 .globl print_value
syscall
sw $v0, valor($zero) print_value:
jal print_value lw $a0, valor($zero)
li $v0,10 li $v0, 1
syscall syscall
jr $ra
.data
.globl valor .data
valor: .word 1 .extern valor 4
Ligadores
 Ligação pode ser realizada de forma
 Estática
 Realiza duas passagens
 Primeira passagem
o Recolhe informações das tabelas de definição
 Segunda passagem
o Copia código objeto para executável
o Consulta tabela de uso e resolve referências
 Em tempo de carga
 Referência a um módulo externo faz com que o carregador
 Busque módulo faltante e realize a ligação
 Em tempo de execução
 Exemplo de emprego deDLLs
Carregador (Loader)
 Função
 Responsável por copiar um programa para a MP e preparar sua
execução

 Tarefas principais
 Verificar se o programa existe
 Dimensionar a quantidade de memória necessária
 Solicitar ao SO a quantidade de memória necessária
 Copiar o código para a memória
 Ajustar os endereços do código executável
Carregador
 Tipicamente integrado com o SO

 Tipos de carregadores
 Absoluto
 Relocador
 Dinâmico
Carregador Absoluto
 Considera que programa é carregado sempre no mesmo
endereço
 Referências específicas a um endereço
 Referências definidas em tempo de projeto
 Pelo programador ou pelo compilador / montador

 Referências criadas pelo programador


 Programador deve conhecer a plataforma
 Inclusão/alteração de instruções implica em redefinição de endereços

 Referências criadas pelo compilador / montador


 Emprega símbolos para representar as referências
Carregador Relocador
 Programa carregado de forma absoluta impõe restrições

 Solução:
 Trabalhar com endereços relativos a ponto conhecido
 E.g. início do programa

 Carga do programa na posição X da memória


 Implica em adicionar X a cada uma das referências do programa
Carregador Dinâmico
 Problema do emprego de carregador relocador
 Não adequado para situações de swapping
 Translado de processos entre MP e disco pode maximizar o uso do
processador
 Processos não necessariamente retornam a mesma posição de memória
anterior

 Solução
 Executar relocação no momento em que a posição for referenciada
 Endereços devem ser relativos ao início do módulo na memória
 Usa registrador específico (registrador de base)

Você também pode gostar