next up previous contents
Next: Algoritmos do carregador de Up: Carregadores e ligadores Previous: Estruturas de dados adicionais   Sumário


Carregamento e ligação combinados

Assim como esquemas primitivos de montagem já incorporavam o processo de carregamento (Seção 4.2), estratégias iniciais de ligação eram combinadas ao processo de carregamento.

Uma das estratégias primitivas adotada em alguns sistemas era o esquema de ligação por vetor de transferência, que reservava ao início da área de carregamento um espaço onde os endereços efetivos de rotinas seriam definidos. No código montado, as referências às rotinas eram ``desviadas'' para posições no vetor de transferência; na posição correspondente, encontrava-se uma instrução de desvio para a posição efetiva de memória onde a rotina havia sido carregada. A limitação desse tipo de programa é que apenas referências externas a rotinas podiam ser resolvidas automaticamente.

Nesta seção apresentaremos as atividades desempenhadas por um carregador de ligação direta, outro esquema simples que combina carregamento e ligação em um único programa. Carregadores de ligação direta permitem a resolução a rotinas e dados externos, representando um avanço em relação ao esquema de vetor de transferência.

A operação do carregador de ligação direta será apresentada a partir de um exemplo simples. Considere o seguinte programa, que faz referência a um símbolo externo DIGIT:
\begin{listing}{1}
MAIN MOVE.B DIGIT,D0
CMPI.B  ...
Este programa obtém um valor inteiro entre 0 e 15 de DIGIT e irá colocar na variável CHAR sua representação ASCII, entre '0' e 'F'.

No segmento onde DIGIT é definido, é preciso indicar que este símbolo poderá ser referenciado externamente. Para tanto, a pseudo-instrução GLOB é utilizada.

O trecho a seguir ilustra a definição de DIGIT em outro segmento:
\begin{listing}{1}
GLOB DIGIT
PGM MOVE.W VALUE,D0
MOVE.W D0,DIGIT
RTS
VALUE DS.W 1
DIGIT DS.W 1
END
\end{listing}

O efeito da pseudo-instrução GLOB será a criação de um registro do tipo ESD com tipo de definição LD -- quando a posição relativa do símbolo for definida na tabela de símbolos locais, a informação do registro deverá ser complementada.

O montador deverá gerar o seguinte módulo objeto (com campos separados por pontos) para o segmento MAIN:

   0.'MAIN'.'SD'.00.1C
   1.00.6.103900000000
   1.06.4.0C00000A
   1.0A.2.6D02
   1.0C.2.5E00
   1.0E.4.06000030
   1.12.6.13C00000001A
   1.18.2.4E75
   1.1A.2.0000
   2.02.4.'DIGIT'
   2.14.4.'MAIN'
   3.00
Neste exemplo, valores numéricos são apresentados em hexadecimal e símbolos na forma de seqüências ASCII -- na realidade, o módulo objeto teria apenas a seqüência de bits associada a cada uma destas representações.

O início do módulo objeto contém o diretório de símbolos externos (ESD, registros com primeiro campo com valor 0), o código de máquina gerado (TXT, registros com primeiro campo 1), o diretório de relocação e ligação (RLD, registros com primeiro campo 2) e o registro de fim de segmento (END, com primeiro campo 3). Para o registro de fim de segmento, a posição relativa de execução (posição 00) é especificada.

Similarmente, para o segmento PGM o seguinte módulo é gerado:

   0.'PGM'.'SD'.00.12
   0.'DIGIT'.'LD'.10.2
   1.00.6.30390000000E
   1.06.6.33C000000010
   1.0C.2.4E75
   1.0E.2.0000
   1.10.2.0000
   2.02.4.'PGM'
   2.08.4.'PGM'
   3.



Subsections
next up previous contents
Next: Algoritmos do carregador de Up: Carregadores e ligadores Previous: Estruturas de dados adicionais   Sumário
Ivan L. M. Ricarte 2003-02-14