next up previous contents
Next: Segundo passo Up: Montadores em dois passos Previous: Motivação   Sumário


Primeiro passo

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.


\begin{Program}
% latex2html id marker 3153
[htbp]
\begin{algorithm}{assembler1...
...\end{IF} \end{WHILE} \end{algorithm} \caption{Passo 1 do montador.}\end{Program}

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.


next up previous contents
Next: Segundo passo Up: Montadores em dois passos Previous: Motivação   Sumário
Ivan L. M. Ricarte 2003-02-14