next up previous contents
Next: Macro-instruções Up: Programas assembly Previous: Estrutura de programa assembly   Sumário


Pseudo-Instruções

Além das instruções do processador, um programa assembly preparado para um montador também pode conter pseudo-instruções que estabelecem a conexão entre referências simbólicas e valores a serem efetivamente referenciados. Cada montador pode oferecer um conjunto de pseudo-instruções diferenciado. As pseudo-instruções descritas a seguir representam um subconjunto significativo de facilidades oferecidas por montadores.

A pseudo-instrução de substituição simbólica, EQU, associa um valor definido pelo programador a um símbolo. Por exemplo, a linha de instrução

 SIZE     EQU     100
associa o valor decimal 100 ao símbolo SIZE, que pode ser posteriormente referenciado em outras instruções, como em
          MOVE    #SIZE,D0

Para essa pseudo-instrução, o rótulo deve estar sempre presente e o operando pode ser qualquer expressão que, quando avaliada, defina o valor para o símbolo. Essa expressão pode envolver outros símbolos já definidos.

A pseudo-instrução EQU define símbolos que serão usados durante o processo de montagem, mas que não farão parte do módulo-objeto. Para definir constantes para a execução do código, ou seja, que ocuparão algum espaço em memória durante a execução do programa gerado, as pseudo-instruções DC e DS devem ser usadas.

A definição de variável inicializada, isto é, com algum valor constante definido no momento da alocação de espaço para a variável, dá-se através da pseudo-instrução DC, como nos exemplos

 CONTADOR  DC.L     100
 ARR1      DC.W     0,1,1,2,3,5,8,13
 MENSAGEM  DC.B     'Alo, pessoal!'
O rótulo deve estar presente nessa instrução para permitir referenciar a posição de memória de cada variável ao longo do código. O sufixo no código de operação indica o tamanho em bytes para cada variável, seguindo o padrão das instruções da família 68K. Assim, CONTADOR fará referência a uma posição de memória cujos quatro bytes seguintes terão inicialmente a representação para o valor 100. ARR1 é uma referência para a posição de memória que dá início a um bloco contíguo de oito palavras de dois bytes, cada uma delas com o valor especificado na posição correspondente no operando. De forma similar, MENSAGEM faz referência ao início de um bloco de treze bytes representados em ASCII no operando.

Outra forma de reservar um espaço de memória para armazenar valores é através da pseudo-instrução de declaração de variáveis, DS, que reserva a quantidade de espaço indicada mas não inicializa seu conteúdo. Por exemplo,

 VALUE    DS.W      1
associa ao símbolo VALUE uma referência para um endereço de memória que tem espaço suficiente para armazenar valores de uma variável de tamanho dois bytes (word).

A pseudo-instrução ORG determina a origem do segmento. Um segmento é um conjunto de palavras de máquina que deve ocupar um espaço contíguo na memória principal. A posição de memória (endereço) associada ao início do segmento é denominada a sua origem. O módulo-objeto gerado pelo montador contém tipicamente pelo menos dois segmentos, um segmento de código de máquina e um segmento de dados.

O efeito da pseudo-instrução ORG depende do tipo de montador que irá interpretá-la. Em alguns casos, pode ser uma definição de um endereço absoluto de memória no qual a origem do segmento deve ser posicionada. Em outros, é apenas a definição de um nome para referências futuras ao segmento quando sua posição de origem for definida. A forma genérica aqui adotada para a instrução será

          ORG ident

onde ident é um identificador que pode ser um valor constante já definido (no caso dos montadores absolutos) ou estar sendo definido como o nome de um segmento (nos demais casos).

Por exemplo, no trecho de programa a seguir

 SEG1     EQU       $1000
          ORG       SEG1
          MOVE.W    DATA,D0
          MOVE.W    D0,DATA+2
          RTS

indica que a primeira instrução MOVE.W (na terceira linha) estará alocada à posição $1000 da memória, dando início ao segmento de código do módulo-objeto que será gerado.

Uma outra pseudo-instrução importante é END, que indica ao montador o fim do programa assembly. Seu formato geral é

          END       ident

onde o identificador no operando está associado a um rótulo do início do programa que está sendo encerrado por essa pseudo-instrução. Assim, esse identificador só deve estar presente uma única vez no código, mesmo que o programa fonte esteja distribuído entre diversos arquivos -- em geral, está associado a um ``módulo principal''. Nos demais módulos, a pseudo-instrução END aparece sem argumentos, sempre na última linha.

No caso de um programa cujo código-fonte está distribuído entre diversos segmentos, pode ser preciso fazer referências desde um segmento a variáveis definidas em outros arquivos-fontes. Para possibilitar essa conexão de referências, a pseudo-instrução GLOB é usada para indicar que cada um dos símbolos indicados pode ser referenciável externamente, ou seja, torna o símbolo visível globalmente. Seu formato genérico é

          GLOB      idents
onde idents é a lista de identificadores (separados por vírgulas, se mais de um estiver presente) definidos nesse segmento com a pseudo-instrução que podem ser referenciados a partir de outros módulos. Os demais símbolos definidos no segmento são considerados de escopo local, ou seja, são invisíveis para os módulos externos.

Alguns montadores definem pseudo-instruções tais como EXTERN para indicar que o símbolo que está sendo usado no módulo foi definido externamente, em outro módulo. No entanto, essa pseudo-instrução é desnecessária se for assumido que todos os símbolos referenciados mas não definidos localmente devem estar definidos externamente; esse comportamento é adotado pelo montador GNU, o programa as.


next up previous contents
Next: Macro-instruções Up: Programas assembly Previous: Estrutura de programa assembly   Sumário
Ivan L. M. Ricarte 2003-02-14