EA-869 - Dúvidas Frequentes

EA-869 - Dúvidas Frequentes

Capítulo IX (18.6.98) e (1.2006)


(Ting - 2s97), (Léo - 1s2006)
A. Solução do exercício 1 do Capítulo.

B. Solução do exercício 2 do Capítulo.

C. Solução do exercício 3 do Capítulo.

D. Solução do exercício 4 do Capítulo.

E. Solução do exercício 5 do Capítulo.

F. Solução do exercício 6 do Capítulo.

G. É possível projetar um montador que trate referências simbólicas externas, ou seja, que trate programas que utilizem rótulos definidos em outros programas?


Solução do exercício 1 do Capítulo.

    De acordo com a Seção IX.2.4 do livro-texto o principal papel de um montador é traduzir automaticamente os códigos em linguagem simbólica para códigos de máquina, em formato binário. Usualmente distinguem-se nas instruções de máquina três campos:
    • campo de código de operação;
    • campo de modo de endereçamento; e
    • campo de endereços/operandos.
    Neste caso a correspondência entre os mnemônicos das intruções e os códigos binários (Capítulo II) e a correspondência entre o modo de endereçamento e o código binário são biunívocas (Capítulo IV). Portanto, a tradução, instrução por instrução, seria direta, se não fossem permitidas as referências simbólicas e as
    pseudo-instruções em linguagem simbólica.
    Um montador que consegue tratar as referências simbólicas, ou seja, referências às posições da Memória por rótulos deve prover um mecanismo que resolva estes rótulos e os substitua pelos endereços correspondentes, processáveis pelo processador.
    Se em um programa todos os rótulos utilizados forem definidos antes de serem referenciados, o montador poderá traduzi-lo em um só passo. Pois, à medida que vão se resolvendo os rótulos eles vão sendo armazenados na tabela de símbolos e quando referenciados mais tarde, o montador só precisa consultar a tabela para obter o endereço da Memória correspondente.
    Outra estratégia utilizada para resolver todas as referências simbólicas com um só passo, mesmo tendo referências à frente, é fazer um backtracking cada vez que o montador inserir uma nova entrada na tabela de símbolos. O montador sempre verifica se essa nova entrada substitui algum rótulo pendente que ficou para trás.

Solução do exercício 2 do Capítulo.

    Para gerar a tabela de símbolos de cada programa, o montador necessita de informações contidas nas tabelas de Operações de Máquina (TIM) e de Pseudo-Operações (TPI).
    Considerando que o formato geral das instruções seja
    <Código de Operação>    <Operando1>,<Operando2>
    as seguintes tabelas são definidas:
    1. TIM (a última coluna não faz parte da TIM. Ela foi incluída para descrever o efeito de cada instrução)
      Mnemônico Código de Operação Comprimento Rotina de Tratamento dos Endereços dos Operandos Comentários
      LOAD SP, 0001 3 LoadSP SP <- (Operando2)
      LOAD HL, 0010 3 LoadHL HL <- (Operando2)
      MVI ,R0 0011 2 MovImed R0 <- Operando1
      MOV ,M 0100 1 MovM M <- (Operando1)
      MOV M,A 0101 1 MovA A <- (M)
      PUSH PSW 0110 1 PushPSW SP <- (PSW)
      CALL 0111 3 Call PC <- Operando1
      POP PSW 1000 1 PopPSW PSW <- (SP)
      HLT 1001 1 - Pare
      RET 1010 1 - Retorne ao programa principal
      INC HL 1011 1 IncHL HL <- (HL) + 1
      ADD M 1100 1 Add Acumulador <- (M)+(Acumulador)
    2. TPI
      Mnemônico Comprimento Rotina de Tratamento da Pseudo-Instrução
      ORG 0 RORG
      EQU 0 REQU
      DB 1 RDB
      END 0 REND
    As seguintes tabelas mostram a tradução, instrução por instrução, dos dois programas:
    Instrução Conteúdo do Contador de Posição (CP) Comentários
    ORG 1000H CP <- 1000H o programa será montado a partir de 1000H
    LOAD SP,200H CP <- (CP) + 3 (CP) é incrementado de 3 (=1003H)
    MVI BBH,R0 CP <- (CP) + 2 (CP) é incrementado de 2 (=1005H)
    PUSH PSW CP <- (CP) + 1 (CP) é incrementado de 1 (=1006H)
    CALL SUB CP <- (CP) + 3 (CP) é incrementado de 3 (=1009H)
    POP PSW CP <- (CP) + 1 (CP) é incrementado de 1 (=100AH)
    HLT CP <- (CP) + 1 (CP) é incrementado de 1 (=100BH)
    SUB: MVI DDH,R0 CP <- (CP) + 1 (CP) é incrementado de 1 (=100CH); Inserir o rótulo SUB na tabela de símbolos com o endereço correspondente igual a 100BH
    RET CP <- (CP) + 1 (CP) é incrementado de 1 (=100DH)
    END CP <- (CP) + 0 Fim do Programa
    Instrução Conteúdo do Contador de Posição (CP) Comentários
    ORG 100H CP <- 100H o programa será montado a partir de 100H
    ENDM: EQU 200H CP <- (CP) + 0 Inserir o rótulo ENDM na tabela de símbolos com o endereço correspondente igual a 200H
    DADO1: DB 05H CP <- (CP) + 1 Atribuir ao endereço 100H o valor 5H; Inserir o rótulo DADO1 na tabela de símbolos com o endereço correspondente igual a 100H; (CP) é incrementado de 1 (=101H).
    DADO2: DB 07H CP <- (CP) + 1 Atribuir ao endereço 101H o valor 7H; Inserir o rótulo DADO2 na tabela de símbolos com o endereço correspondente igual a 101H; (CP) é incrementado de 1 (=102H).
    INICIO: LOAD HL,ENDM CP <- (CP) + 3 Inserir o rótulo INICIO na tabela de símbolos com o endereço correspondente igual a 102H; (CP) é incrementado de 3 (=105H).
    MOV DADO1,M CP <- (CP) + 3 (CP) é incrementado de 3 (=108H)
    INC HL CP <- (CP) + 1 (CP) é incrementado de 1 (=109H)
    MOV DADO2,M CP <- (CP) + 3 (CP) é incrementado de 3 (=10CH)
    LOAD HL,ENDM CP <- (CP) + 3 (CP) é incrementado de 3 (=10FH)
    MOV M,A CP <- (CP) + 1 (CP) é incrementado de 1 (=110H)
    INC HL CP <- (CP) + 1 (CP) é incrementado de 1 (=111H)
    ADD M CP <- (CP) + 1 (CP) é incrementado de 1 (=112H)
    INC HL CP <- (CP) + 1 (CP) é incrementado de 1 (=113H)
    MOV M,A CP <- (CP) + 1 (CP) é incrementado de 1 (=114H)
    HLT CP <- (CP) + 1 (CP) é incrementado de 1 (=115H)
    END CP <- (CP) + 0 Fim do Programa

    Pode-se ver que, como resultado, teremos as seguintes entradas na tabela de símbolos:

    Símbolo Valor
    SUB 100BH
    ENDM 200H
    DADO1 100H
    DADO2 101H
    INICIO 102H
    Observe que

Solução do exercício 3 do Capítulo.

    Considerando que o montador projetado apresenta a seguinte forma de processamento:
    1. resolver primeiro os rótulos (símbolos); e
    2. gerar o formato binário de uma instrução, assim que os endereços dos operandos tivessem sido resolvidos,
    então o programa
    em 100H pode ser traduzido em um passo. Pois, observe que todos os rótulos utilizados nas instruções, no caso ENDM, DADO1 e DADO2 e INICIO foram definidos antes do seu uso.
    O programa em 1000H, por sua vez, tem que ser traduzido em dois passos, já que a única referência simbólica, SUB, foi definida depois do seu uso (definição à frente).

Solução do exercício 4 do Capítulo.

    Vimos no Capítulo IV que o modo de endereçamento relativo é aquele cujo endereço efetivo do operando é obtido pela expressão
    PC <- (PC) + <end>,
    onde (PC) é o conteúdo corrente do contador de programa (lembre-se de que (PC) corresponde ao endereço da Memória onde está a instrução corrente adicionado do comprimento desta instrução; no caso, pelo desenho são 3 bytes) e <end>, o valor no campo de endereço.
    Se a máquina não suportar o modo de endereçamento relativo, o montador deve substituir .+6 da instrução
    JUMP     .+6
    pelo seu endereço efetivo (modo de endereçamento absoluto) correspondente e colocá-lo no campo de endereço da instrução em formato binário. Este endereço é facilmente computado pela equação (a ser feito, por exemplo, pela rotina de tratamento de endereços da instrução JUMP)
    end_efetivo = (CP) + 3 + 6,
    onde CP denota o contador de posição utilizado pelo montador (lembre-se de que o conteúdo deste contador é atualizado de acordo com a quantidade de memória que cada instrução ocupa).

Solução do exercício 5 do Capítulo.

  1. Usando o montador definido no livro-texto, não. No livro-texto o montador executa a montagem em dois passos sequencialmente:
    1. resolver ou definir os rótulos; e
    2. gerar o programa em linguagem de máquina.
    Para o trecho de programa dado precisaremos no mínimo dois passos para resolver os rótulos, devido à dependência entre eles (observe que o endereço do rótulo ST só pode ser resolvido depois de resolver o rótulo START). Na primeira varredura ele resolve o endereço do rótulo START e na segunda varredura, o rótulo ST. Só depois disso o montador iniciará a geração do programa em linguagem de máquina.
  2. ST e START são sinônimos no sentido que ambos denotam o mesmo endereço da Memória (no caso, o endereço que contém a instrução MOVE A,B).
  3. Permitir referências distintas para um mesmo endereço da Memória, de forma a adequar à semântica de aplicação. Podemos, por exemplo, utilizar os sinônimos SINE e SENO para referenciar o mesmo trecho de programa que calcula o seno de um valor.

Solução do exercício 6 do Capítulo.

  1. Fazendo varredura sequencial, instrução a instrução, três passos são necessários para gerar o programa em linguagem de máquina. Na primeira varredura, poderão ser resolvidos os rótulos X e START; na segunda, o rótulo ST; e na terceira, o conteúdo de X, conforme as tabelas abaixo (note que incluimos a pseudo-instrução ORG $1000 no programa):

    Passo 1:

    Mnemônico Contador de Posição Comentários
    ORG 1000 CP <- 1000H Endereço inicial do programa é 1000H
    ST: EQU START CP <- 1000H+0 O conteúdo do CP não é alterado; nem ST pode ser inserido na tabela de símbolos, pois START não consta ainda na tabela de símbolos
    X: DW ST+6 CP <- 1000H+2 Inserir X na tabela de símbolos com o endereço correspondente igual a 1000H; (CP) é incrementado de 2 (=1002H pois a pseudo-operação DW reserva 2 bytes à variável X (supondo que uma palavra (Word) corresponda a 2 bytes),
    START: MOV A,B CP <- 1002H+??? Inserir START na tabela de símbolos com o endereço correspondente igual a 1002H; (CP) deve ser incrementado de ???, que corresponde ao tamanho da instrução.

    Passo 2:

    Mnemônico Contador de Posição Comentários
    ORG 1000 CP <- 1000H Endereço inicial do programa é 1000H
    ST: EQU START CP <- 1000H+0 O conteúdo do CP não é alterado; Inserir ST na tabela de símbolos com o endereço correspondente igual a 1002H, uma vez que o valor corresponde a START seja 1002H.
    X: DW ST+6 CP <- 1000H+2 (CP) é incrementado de 2 (=1002H)
    START: MOV A,B CP <- 1002H+??? (CP) deve ser incrementado de ???, que corresponde ao tamanho da instrução.

    E, no Passo 3, o montador consegue calcular com base na tabela de símbolos o valor inicial na posição referenciada pelo rótulo X, que é 1002H + 6 (=1008H) e gerar as instruções em formato binário.

  2. O conteúdo do endereço referenciado por X é igual ao endereço referenciado por START, que é sinônimo de ST, adicionado de 6.
  3. O conteúdo de X é um apontador a um endereço relativo ao endereço da instrução MOV A,B. Isso pode ser utilizado em situações em que o acesso a um endereço é sempre relativo a uma referência, no caso START.

É possível projetar um montador que trate referências simbólicas externas, ou seja, que trate programas que utilizem rótulos definidos em outros programas?

    Sim. Muitos montadores geram, além da tabela de símbolos, um dicionário de símbolos externos (ESD). Neste dicionário são registrados todos os símbolos referenciados, porém não definidos, pelo programa.
    Será visto na disciplina EA876 que este dicionário é utilizado pelos denominados ligadores para resolver referências entre programas "montados" individualmente.
    Observe que um programa que não faz referências externas pode ser executado após a montagem, desde que carreguemos no contador de programa (PC) o endereço da sua primeira instrução.

Last modified: Thu May 15 17:01:22 BRA 2006

Sugestões para leopini@dca.fee.unicamp.br