Considere como exemplo uma subrotina assembly que deverá transferir um valor armazenado em uma posição para outra posição de memória, usando o registrador D0 como armazenador temporário do dado. A subrotina terá o nome PGM, a posição de memória que tem o dado original será rotulada VALUE e a posição de memória destino será rotulada RESULT.
A listagem a seguir apresenta o código fonte, que é simplesmente uma seqüência de caracteres armazenada em um arquivo texto. Como descrito na Seção 4.1.1, strings na primeira coluna denotam rótulos para as posições de memória associadas; a segunda coluna contém strings que representam as instruções (mnemônicos), e a terceira coluna contém strings representando os argumentos das instruções.
No primeiro passo de execução, o montador deve gerar a Tabela de Símbolos. Para o exemplo acima, a Tabela de Símbolos associada deve conter a seguinte informação:
Símbolo | Valor |
---|---|
DATA | $6000 |
PGM | $4000 |
PROGRAM | $4000 |
RESULT | $6002 |
VALUE | $6000 |
Há duas situações que devem ser consideradas para possibilitar a geração dessa tabela. A primeira situação, a mais simples, é quando a definição do símbolo é derivada de uma pseudo-instrução EQU. Esse caso é o mais simples porque toda a informação necessária para compor a entrada da tabela de símbolos está explícita na instrução. Assim foram definidos os símbolos DATA e PROGRAM na Tabela de Símbolos.
A segunda situação envolve a definição de símbolos usados como rótulos em outras instruções -- no exemplo, o caso de VALUE, RESULT e PGM. Essa situação é mais complexa por necessitar conhecimento da posição no segmento ou na memória que a instrução estará ocupando para poder efetivamente definir seu valor. Para tanto, o contador de localização (LC) deve ser atualizado durante o primeiro passo de acordo com o espaço reservado para cada instrução, informação que deve ser derivada a partir das tabelas de instruções de máquina (MOT) e de pseudo-instruções (POT).
No segundo passo do montador, o código deve ser efetivamente gerado. No caso desse exemplo, dois segmentos serão produzidos.
O primeiro segmento corresponde a uma área de dados, gerada a partir da interpretação das pseudo-instruções DS -- eventualmente, a interpretação de pseudo-instruções DC também poderiam gerar informação para esse segmento, se estivessem presente. O segmento gerado contém a seguinte informação:
Posição | $6000 | $6002 |
---|---|---|
Conteúdo | $0000 | $0000 |
O segundo segmento corresponde à área de instruções, contendo o código de máquina associado a cada instrução. Para gerar esse código, o montador teve que (i) obter a codificação de máquina para cada instrução e (ii) resolver as referências simbólicas presentes nos operandos das instruções.
O conteúdo do segundo segmento, assumindo que endereços absolutos são representados como long word, contém:
Posição | $4000 | $4002 | $4004 | $4006 | $4008 | $400A | $400C |
---|---|---|---|---|---|---|---|
Conteúdo | $3038 | $0000 | $6000 | $31C0 | $0000 | $6002 | $4E75 |
Na seqüência, serão analisados os procedimentos que o montador deve realizar para possibilitar essa geração de código.