Considerando a montagem em dois passos, o primeiro passo pode ser descrito pelo Algoritmo 4.1. Neste primeiro passo, a principal atividade é a manipulação de rótulos de forma a descobrir o símbolo que está sendo criado em cada linha, se for o caso, e manter o controle sobre qual a posição (valor) de definição do símbolo. Esta última informação é obtida a partir da atualização do contador de localização LC a partir da avaliação do tamanho das instruções anteriores.
Nesse procedimento do primeiro passo do montador, o arquivo fonte é manipulado linha a linha. Para cada linha, o código de operação é analisado para descobrir se a instrução é uma pseudo-instrução (código de operação encontrado na POT) ou uma instrução assembly (código de operação encontrado na MOT). Caso o código não esteja em nenhuma das duas tabelas, uma mensagem de erro deve ser apresentada indicando que a instrução não foi reconhecida e o processo deve ser abortado.
Observe que duas buscas devem ser realizadas para cada linha de instrução obtida do arquivo fonte. Como a Tabela de Pseudo-Instruções é bem menor que a Tabela de Instruções de Máquina, a busca é inicialmente realizada na primeira tabela. Apenas se o código buscado não for encontrado na POT a busca será realizada na tabela maior. A eficiência de implementação destas buscas irá se refletir diretamente na eficiência do montador. Por este motivo, é importante que bons algoritmos de busca e de manutenção da informação em tabelas sejam adotados na implementação do montador.
A atualização da Tabela de Símbolos (ST) é efetivada durante o processamento das pseudo-instruções com código de operação EQU, DC ou DS (estas duas tratadas na condição else no caso default) ou durante o processamento de instruções assembly com campo de rótulo não-nulo. Para a pseudo-instrução EQU, o rótulo é o nome do símbolo cujo valor deve ser obtido do operando. No caso das pseudo-instruções DC e DS, o rótulo é o nome do símbolo cujo valor é a posição corrente da instrução.
No processamento das demais pseudo-instruções, nenhum símbolo é criado. Se a pseudo-instrução é ORG, apenas o contador de localização deve ser atualizado. A pseudo-instrução END deve encerrar o primeiro passo do montador, invocando o segundo passo.
O processamento das pseudo-instruções ORG e EQU requerem, já nesse passo, uma avaliação do valor do operando. Esse operando pode ser um literal ou um símbolo previamente definido. Caso seja um literal, o valor do operando é obtido a partir da conversão da string que representa o valor em alguma base -- binária, octal, decimal ou hexadecimal. Caso seja um símbolo previamente definido, o valor é obtido a partir da busca da Tabela de Símbolos. Esse processamento auxiliar é realizado pela rotina GETOPERANDVALUE.
O procedimento do montador deve ainda avaliar o espaço ocupado pela instrução sendo processada, com o fim de atualizar corretamente o contador de localização. Para tanto, utiliza-se informação contida na tabela correspondente (entry) e o campo do operando, conforme indicado nas invocações à rotina GETINSTRUCTIONSIZE.
Usando a rotina do exemplo motivador (Seção 4.2.1), é possível acompanhar o processo de atribuição de valores a símbolos que ocorre durante o primeiro passo da montagem. À medida que as linhas de códigos forem lidos, o contador de posição LC vai assumir os valores apresentados na primeira coluna, em hexadecimal:
LC | Instrução | ||
---|---|---|---|
0000 | DATA | EQU | $6000 |
0000 | PROGRAM | EQU | $4000 |
0000 | <#16954#> | ORG | DATA |
6000 | VALUE | DS.W | 1 |
6002 | RESULT | DS.W | 1 |
6004 | <#16966#> | ORG | PROGRAM |
4000 | PGM | MOVE.W | VALUE,D0 |
4006 | <#16974#> | MOVE.W | D0,RESULT |
400C | <#16978#> | RTS | <#16980#> |
400E | <#16982#> | END | PGM |
O valor inicial do LC é 0. A pseudo-instrução EQU não ocupa espaço no código gerado e portanto não altera o valor do LC. O efeito das duas primeiras instruções é registrar na Tabela de Símbolos a informação que os símbolos DATA e PROGRAM têm os valores $6000 e $4000, respectivamente.
A pseudo-instrução ORG da terceira linha também não ocupa espaço de código, mas tem efeito sobre o LC -- ele passará a registrar a posição de memória para a próxima linha do programa. Assim, LC passará a $6000, que é o valor de DATA obtido da Tabela de Símbolos.
A linha seguinte reserva espaço para a variável VALUE. Na Tabela de Símbolos será registrado para o rótulo (o símbolo VALUE) o valor de LC ($6000). Como o sufixo do tamanho para a pseudo-instrução DS é .W, será reservado espaço para uma word (dois bytes). Portanto, o LC é incrementado para o valor $6002.
Da mesma forma, na linha seguinte, ao símbolo RESULT será associado o valor $6002 na Tabela de Símbolos e o LC será incrementado para $6004.
Com a pseudo-instrução ORG da sexta linha o LC será alterado para $4000. Deste modo, ao rótulo definido na instrução seguinte, PGM, é associado na Tabela de símbolos o valor $4000.
Para incrementar corretamente o LC, é preciso saber quantos bytes serão ocupados pela instrução da sétima linha. A partir do tratamento dos operandos e assumindo que endereços absolutos são representados em quatro bytes (long word), encontra-se a informação que seis bytes serão usados para esta instrução, de forma que o LC será incrementado para $4006. Da mesma forma, encontra-se que a instrução seguinte também ocupa seis bytes, e o LC é incrementado para $400C.
Finalmente, no processamento da instrução RTS encontra-se que ela ocupa dois bytes, sendo que o valor do LC passa a $400E. A pseudo-instrução END simplesmente indica ao montador o fim do programa fonte, tendo como argumento um endereço da primeira instrução executável.