Assemblers, Linkeditores e Carregadores
Por: Carolina234 • 25/6/2018 • 2.029 Palavras (9 Páginas) • 292 Visualizações
...
Os endereços dos itens de dados e instruções são determinados por meio do uso de um contador de programa para a montagem, chamado contador de instrução (program counter ou instruction counter). O contador de instrução gerencia o endereço da instrução executada e dos itens de dados a ela associados durante a montagem, que geralmente é inicializada com 0 (zero). No início do primeiro passo, é incrementado de acordo com o tamanho de cada instrução.
Durante este passo, o montador também efetua quaisquer operações aritméticas em tempo de montagem, e insere as definições de todos os rótulos de funções e variáveis e as constantes, em uma tabela chamada Tabela de Símbolos (TS).
Figura 1. Sequência típica para geração de um programa em linguagem de máquina.
[pic 2]
Fonte: Estrela; Herrmann, 2016.
A razão principal para exigir uma segunda passagem do montador é permitir que símbolos possam ser usados no programa antes de serem definidos. Após a primeira passagem, o montador terá identificado todos os símbolos e os colocar na TS. Na segunda passagem, gerará código de máquina, inserindo os identificadores dos símbolos os quais são conhecidos agora.
---------------------------------------------------------------
-
Ligador ou Linkeditor
A compilação separada permite que um programa seja dividido em partes que são armazenadas em arquivos diferentes. Cada arquivo contém uma coleção logicamente relacionada de sub-rotinas e estruturas de dados que formam um módulo de um programa maior. Um arquivo pode ser compilado e montado independente de outros arquivos, de modo que as mudanças em um módulo não exigem a recompilação do programa inteiro. A compilação separada necessita da etapa adicional de link-edição para combinar os arquivos-objeto de módulos separados e consertar suas referências não resolvidas.
A ferramenta que mescla esses arquivos é o link editor (ver Figura 2). Ele realiza três tarefas:
- Pesquisaasbibliotecasdeprogramaparaencontrarrotinasdebibliotecausadaspeloprograma.
- Determinaoslocaisdamemóriaqueocódigodecadamóduloocuparáerelocasuasinstruções ajustando referências absolutas.
- Resolve referências entre os arquivos.
Figura 2. O link-editor pesquisa uma coleção de arquivos-objeto e bibliotecas de programa para encontrar rotinas usadas em um programa, combina-as em um único arquivo executável e resolve as referências entre as rotinas em arquivos diferentes.
[pic 3]
Fonte: Larus, James R.; 1927.
A primeira tarefa de um link-editor é garantir que um programa não contenha rótulos indefinidos. O link-editor combina os símbolos externos e as referências não resolvidas a partir dos arquivos de um programa. Um símbolo externo em um arquivo resolve uma referência de outro arquivo se ambos se referirem a um rótulo com o mesmo nome. As referências não combinadas significam que um símbolo foi usado, mas não definido em qualquer lugar do programa.
Referências não resolvidas nesse estágio do processo de link-edição não necessariamente significam que um programador cometeu um erro. O programa poderia ter referenciado uma rotina de biblioteca cujo código não estavanosarquivos-objetopassadosaolink-editor.Depoisdecombinaros símbolos no programa, o link-editor pesquisa as bibliotecas de programa do sistema para encontrar sub-rotinas e estruturas de dados predefinidas que o programa referência. As bibliotecas básicas contêm rotinas que leem e escrevem dados, alocam e liberam memória, e realizam operações numéricas. Outras bibliotecas contêm rotinas para acessar bancos de dados ou manipular janelas de terminal. Um programa que referencia um símbolo não resolvido que não está em qualquer biblioteca é errôneo e não pode ser link-editado. Quando o programa usa uma rotina de biblioteca, o link-editor extrai o código da rotina da biblioteca e o incorpora ao segmento de texto do programa. Essa nova rotina, por sua vez, pode depender de outras rotinas de biblioteca, de modo que o link-editor continua a buscar outras rotinas de biblioteca até que nenhuma referência externa esteja não resolvida ou até que uma rotina não possa ser encontrada.
Se todas as referências externas forem resolvidas, o link-editor em seguida determina os locais da memória que cada módulo ocupará. Como os arquivos foram montados isoladamente, o montador não poderia saber onde as instruções ou os dados de um módulo seriam colocados em relação a outros módulos. Quando o link-editor coloca um módulo na memória, todas as referências absolutas precisam ser relocadas para refletir seu verdadeiro local. Como o link-editor possui informações de relocação que identificam todas as referências relocáveis, ele pode eficientemente localizar e remendar essas referências.
O link-editor produz um arquivo executável que pode ser executado em um computador. Normalmente, esse arquivo tem o mesmo formato de um arquivo objeto, exceto que não contém referências não resolvidas ou informações de relocação.
O ligador coleta procedimentos traduzidos separadamente, ligando-os uns aos outros para que eles possam executar um PE.
Se o compilador ou o montador lesse um conjunto de PFs e produzisse diretamente um PE em linguagem de máquina pronto para ser executado, bastaria que um único comando fonte fosse alterado, para que todos os PFs tivessem que ser novamente traduzidos.
Usando módulos objeto separados, o único procedimento a ser traduzido seria aquele modificado. Havendo a necessidade de realizar apenas a etapa de ligação dos módulos separados novamente, sendo esta tarefa mais rápida que a tradução.
-
Loaders (Carregadores)
Normalmente é de responsabilidade do sistema operacional carregar e executar arquivos. A parte do sistema operacional que executa essa função é chamada de loader (carregador).
Há dois tipos de loaders: relocável e absoluto. O loader absoluto é o mais simples e mais rápido dos dois. O loader carrega o arquivo em memória na locação especificada pela parte inicial (cabeçalho) do arquivo, e então passa o controle ao programa.
...