EA-869 - Dúvidas Frequentes
Capítulo IX
Solução do exercício 1 do Capítulo.
Solução do exercício 2 do Capítulo.
Solução do exercício 3 do Capítulo.
Solução do exercício 4 do Capítulo.
Solução do exercício 5 do Capítulo.
Solução do exercício 6 do Capítulo.
É 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 são 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 ser
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 (TOM) e de Pseudo-Operações (TPO).
Considerando que o formato geral das instruções seja
<Código de Oepração> <Operando1>,<Operando2>
as seguintes tabelas são definidas:
- TOM (a última coluna não faz parte da TOM. 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) |
- TPO
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 |
É fácil 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
- para resolver os rótulos, precisamos basicamente
- do endereço inicial do segmento de instruções/dados
(usualmente especificado através da pseudo-instrução
ORG); e
- do comprimento, em bytes, de cada instrução (usualmente fornecido pelas tabelas
TOM e TPO pré-definidas);
- o modo de endereçamento já está embutido nos códigos de
operação fornecidos na tabela TOM.
Por exemplo, o código 0011 denota não só a operação ser
de transferência como também o modo de endereçamento
do primeiro operando ser imediato;
- não são necessárias as rotinas de tratamento de endereços
para as instruções HLT e
RET, uma vez que elas não requerem nenhum operando; e
- 1000H, 1000H e $1000 (notação utilizada
na Seção IX.2.3.3) designam igualmente o valor 1000
na base hexadecimal.
Solução do exercício 3 do Capítulo.
Considerando que o montador projetado apresenta a seguinte
forma de processamento:
- resolver primeiro os rótulos (símbolos); e
- gerar o formato binário de uma instrução, assim que
os endereços dos operandos tivessem sido resolvidos,
então o programa 2 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 1, 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.
- Usando o montador definido no livro-texto, não.
No livro-texto o montador executa a montagem em dois passos
sequencialmente:
- resolver ou definir os rótulos; e
- 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.
- 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 MOV A,B).
- 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.
- 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.
- O conteúdo do endereço referenciado por X é igual ao endereço
referenciado por START, que é sinônimo de ST, adicionado
de 6.
- 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 no curso EA877 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: Tue Nov 18 17:01:22 BRA 1997
Sugestões para ting@dca.fee.unicamp.br
Voltar para a página do curso.
Ting