next up previous contents
Next: Relocação e Ligação Up: Carregadores e ligadores Previous: Montagem e carregamento assemble   Sumário


Carregamento absoluto

Uma outra forma simples para contornar as desvantagens do esquema assemble and go consiste em separar o processo de montagem do processo de execução do código montado. Nesse caso, o montador gera um módulo de carregamento que não precisa ser regenerado a cada execução. Adicionalmente, as funcionalidades do montador não são necessárias para a execução -- assim, o espaço de memória ocupado pelo programa montador pode ser liberado durante a execução do programa montado.

Para o carregamento absoluto o módulo de carregamento contém, além do código objeto, a informação sobre as posições de memória para as quais as linhas de código devem ser carregadas. Uma possível estratégia é associar um registro do arquivo objeto a cada segmento, sendo que o início do registro indica a posição de carregamento e o tamanho do segmento em bytes.

O módulo de carregamento para o carregador absoluto é composto por dois tipos de registro. Todos os registros, exceto um, contêm informação que deve ser transferida para a memória na posição indicada (registro tipo 0). O outro tipo de registro deve ter apenas uma ocorrência no fim do módulo de carregamento, correspondendo à informação do endereço para início da execução do programa (registro tipo 1). Registros do tipo 0 são gerados no segundo passo do montador pela rotina ASSEMBLEMACHINECODE, enquanto o registro do tipo 1 é gerado pela rotina ASSEMBLECLOSINGCODE.

No exemplo do código gerado na Seção 4.2.1, a organização do módulo de carregamento segundo esse esquema seria composto por três registros:

0 00006000 4 00000000
0 00004000 E 30380000600031C0000060024E75
1 00004000    

O primeiro campo de cada registro indica o tipo do registro. O valor 0 neste campo indica que o conteúdo a seguir (quarto campo), de dimensão quatro bytes (informação no terceiro campo) deverá ser transferido à memória a partir da posição $6000 (informação do segundo campo). Similarmente, a informação do segundo registro indica a transferência dos 14 bytes do quarto campo a partir da posição $4000. Finalmente, o último registro tem no primeiro campo o valor 1, indicando que a execução deverá ser transferida para a posição indicada no segundo campo ($4000).

Para esse esquema de carregamento, o algoritmo do carregador absoluto é apresentado no Algoritmo 4.3.


\begin{Program}
% latex2html id marker 3313
[htb]
\begin{algorithm}{absoluteLoa...
...\end{IF} \end{WHILE} \end{algorithm} \caption{Carregador absoluto.}\end{Program}

As rotinas auxiliares aqui utilizadas são de funcionalidade simples, servindo para extrair os diversos campos do registro do módulo de carregamento (GETREGISTERTYPE, GETREGISTERADDRESS, GETREGISTERLENGTH e GETREGISTERCONTENT), para transferir código do programa para a posição especificada de memória (MOVETOMEMORY) ou para transferir a execução para o endereço especificado (GOTO).


next up previous contents
Next: Relocação e Ligação Up: Carregadores e ligadores Previous: Montagem e carregamento assemble   Sumário
Ivan L. M. Ricarte 2003-02-14