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.
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).