Beruflich Dokumente
Kultur Dokumente
12.0
Introduo .......................................................................................... 03
12.1
Modelo de Programao.................................................................... 03
12.2
MOV e MVI........................................................................................... 03
12.3
Instrues Aritmticas........................................................................04
12.4
Flag de Transporte, 05
Instrues para o Flag de Transporte, 05
Instrues ADD, 05
Instrues ADC, 06
Instrues SUB, 08
Instrues SBB, 09
Incremento, 11
Decremento, 11
Rotacionar todos para Esquerda, 12
Rotacionar todos para Direita, 12
Rotacionar para a Esquerda com o Transporte, 13
Rotacionar para a Direita com o Transporte, 13
Multiplicar e Dividir por 2, 13
12.5
Instrues Lgicas..............................................................................14
12.6
12.7
Instrues de Salto.............................................................................16
12.8
12.9
JP, 16
JC e JNC, 17
JPE e JPO, 17
Instrues Indiretas............................................................................21
A Pilha, 26
Apontador de Pilha, 26
Instrues PUSH, 27
Instrues POP, 28
CALL e RET, 29
Chamadas e Retornos Condicionais de Sub-rotinas , 31
Glossrio..........................................................................................................32
Exerccios de Fixao.....................................................................................32
Problemas........................................................................................................33
INTRODUO
SAP-3 um microcomputador de 8 bits que , no sentido ascendente, compatvel com o
microprocessador 8085. Neste captulo, a nfase ser no repertrio de instrues do SAP-3. Alm
das instrues do SAP-2, novas instrues sero acrescentadas.
O Apndice 5 mostra os cdigos de operaes, os estados T, os flags e outras infomaes
relacionadas com o SAP-3. No restante deste captulo, refira-se ao Apndice 5 na medida do
necessrio.
12.1 MODELO DE PROGRAMAO
Tudo o que voc precisa saber sobre o hardware do SAP-3 est no modelo de programao da
Fig. 12-1, que mostra os registradores da UCP necessrios ao programador.
Alguns dos registradores j so conhecidos do SAP-2. Por exemplo, o contador de programa
(PC) um registrador de 16 bits que pode contar de 0000H a FFFFH (0 a 65.535 em decimal). Como
voc sabe, o contador de programa contm o endereo da prxima instruo que dever ser
buscada. Este endereo passado ao REM (Registrador Endereador de Memria).
Os registradores A, B e C da UCP so os mesmos do SAP-2. Eles so usados em operaes
lgicas e aritmticas. Como o acumulador tem a largura de apenas 8 bits, o intervalo dos nmeros
sem sinal de 0 a 255 e o intervalo dos nmeros em complemento de 2 de -128 a + 127.
Para um processamento mais eficiente, o SAP-3 conta ainda com alguns registradores de UCP
adicionais (D, E, H e L). Estes registradores de 8 bits podero ser acessados pelas instrues MOV
e MVI como se fazia com os registradores A, B e C. Observe tambm a presena do registrador F,
que contm os flags S, Z e outros.
Finalmente, ainda h o apontador de pilha (SP do ingls stack pointer), um registrador de 16 bits.
Este registrador controla uma parte da memria chamada de pilha. O registrador apontador de pilha
e a pilha sero discutidos posteriormente.
O modelo de programao de que necessitamos para compreender o conjunto de instrues do
SAP-3 est mostrado na Fig. 12-1 onde se v todos os registradores da UCP. Assim, ns poderemos
analisar as instrues do SAP-3,que ascendentemente compatvel como 8080/8085. No final deste
captulo, voc estar compreendendo quase todas as instrues da 8080/8085.
12-2 MOV E MVI
As instrues MOV e MVI funcionam como no SAP-2. A nica diferena est no maior nmero de
registradores que podemos escolher. O formato de qualquer instruo de movimentao de dados
MOV reg1, reg2
onde reg1 = A,B,C,D,E,H ou L
reg2 = A,B,C,D,E,H ou L
Flag de Transporte
Como se mostra na Fig. 6-7, um somador-subtrator de 4 bits produz uma soma S3S2S1S0 e um bit
de transporte. No SAP-1, dois 74LS83 (equivalentes a oito somadores totais) produzem uma soma
de 8 bits e um transporte. Naquele computador simples, o transporte foi desconsiderado. Entretanto,
no SAP-3, o flag de transporte considerado.
A Fig. 12-2a mostra o circuito lgico usado no SAP-3 para realizar somas e subtraes.Quando
SUB est baixo, o circuito soma A com B. Se um transporte final gerado, CARRY fica alto e CY
tambm. Se no h transporte final, CY fica baixo.
Por outro lado, quando SUB est alto, o circuito forma o complemento de 2 de B que, ento,
adicionado a A. Em virtude do XOR final, um CARRY alto que sai do ltimo somador total produz um
CY baixo. Se no ocorrer nenhum transporte, o CY fica alto.
Em resumo
Durante uma operao de adio, CY chamado de vai-um e, durante uma operao de subtrao,
CY chamado de vem-um ou pede-emprestado.
A soma de 8 bits S7S6S5S4S3S2S1S0 armazenada no acumulador da Fig. 12-2b. O transporte
(vai-um ou vem-um} armazenado num flip-flop especial chamado flag de transporte designado CY
na Fig. 12-2b. Este flag funciona como se fosse um bit superior adicinal do acumulador. Isto ,
CY = As
Instrues para o Flag de Transporte
H duas instrues que podemos usar para controlar o flag de transporte. A instruo STC seta o
flag CY se ele j no estiver setado. (STC significa setar transporte, do ingles "set carry"). Assim, se
CY = 0
a execuo de uma STC produz
CY = 1
A outra instruo que controla o transporte a CMC, que significa complementar o transporte, do
ingls "complement the carry.
Quando executada, uma CMC complementa ou inverte o valor de CY. Se CY =1 , ento uma
CMC produz CY = 0. Por outro lado,se CY = 0, ento uma CMC produz CY = 1.
Se voc deseja zerar o flag de transporte e desconhece seu valor atual, deve set-lo e, ento,
complement-lo. Isto , a execuo de
STC
CMC
garante que o valor final de CY ser 0 mesmo que se desconhea o valor inicial de CY.
Instrues ADD
O formato da instruo ADD
ADD reg
onde reg = A, B, C, D, E, H ou L. Esta instruo soma o contedo do registrador designado ao
contedo do registrador acumulador. A soma armazenada no acumulador e o flag de transporte
setado ou zerado dependendo se h um transporte final ou no .
A= 0000 0000
Instrues ADC
A instruo ADC (somar com transporte, "carry" em ingls) formatada como:
ADC reg
onde reg = A, B, C, D, E, H ou L. Esta instruo soma os contedos do flag de transporte e do
registrador especificado ao contedo do acumulador. Como o flag CY est includo, a instruo ADC
torna possvel a soma de nmeros sem sinal fora do intervalo de 0 a 255 ou, com sinal, de -128 a
+127.
E= 0001 0010
e
CY=1
A execuo de ADC
ADCE
produz a seguinte adio:
A= 1001 0110
Instroes SUB
A instruo SUB formatada como
SUB reg
onde reg = A, B, C, D, E, H ou L. Esta instruo subtrai o contedo do registrador especificado do
contedo do acumulador; o resultado armazenado no acumulador. Se ocorrer um vem-um ou
pede-emprestado final, o flag de transporte CY setado. Se no houver vem- um, o flag CY
zerado. Portanto, durante uma subtrao o flag de transporte CY funciona como um flag de pedeemprestado.
Por exemplo, se
A= 0000 1111
C= 0000 0001
Ento
SUB C
produz
O CARRY final 1 mas este complementado durante a subtrao para produzir um CY (Fig.
12-2a). Esta a razo pela qual a execuo de SUB C produz.
e
CY = 0 e A= 0000 1110
Os contedos finais so
CY = 0
A= 1111 1100
EXEMPLO 12-1
Na aritmtica dos nmeros sem sinal, 8 bits podem representar 0 a 255, enquanto 16 bits podem
representar 0 a 65.535. Escreva um programa do SAP-3 que adiciona 700 com 900 e coloca a
resposta nos registradores H e L.
SOLUO
Bytes duplos podem representar os decimais 700 e 900 da seguinte forma:
70010 = 02BCH = 0000 0010 1011 11002
90010 = 0384H = 0000 0011 1000 01002
Aqui est um programa para somar 700 com 900:
Rtulo
Instruo
Comentrio
MVI A,00H
MVI B,02H
MVI C,BCH
MVI D ,03H
MVI E,84H
ADD C
ADD E
MOV L,A
MVI A,00H
ADC B
ADD D
MOV H,A
HL T
;Zerar o acumulador
;Carregar o byte superior (BS) de 700
;Carregar o byte inferior (BI) de 700
;Carregar o BS de 900
Carregar o BI de 900
;Somar o BI de 700
;Somar o BI de 900
;Carregar a sorna parcial
;Zerar o acumulador
;Somar o BS de 700 com o transporte
;Somar o BS de 900
;Carregar a soma parcial
;Parar
A soma est armazenada no registrador L e o bit final de transporte est no flag CY.
A seguir, o acumulador zerado. A ADC B adiciona o byte superior com o flag transporte para se
obter
10
Z=0
CY= 0
11
A= 0111 0100
A= 1110 1001
Como voc observa, o CY original vai para a posio do bit menos significativo no acumulador o bit
mais significativo do acumulador vai para o flag CY.
Rotacionar todos Direita
A instruo rotacionar todos para a direita (RAR = rotate all right) significa rotacionar todos os
bits incluindo o flag CY para a direita como se ilustra na Fig. 12-3b. Se
CY = 1
A= 0111 0100
CY = 0
A= 1011 1010
Desta vez, o CY original vai para a posio mais significativa e o bit menos significativo original
vai para o flag CY.
12
A= 0111 0100
A= 0111 0100
CY = 0
A= 0011 1010
A= 0000 0111
CY = 0
A= 0000 1110
O contedo do acumulador passou do valor decimal 7 para 14. A RAL executou uma multiplicao
por 2.
13
De maneira semelhante. Se
CY = 0
A= 0010 0001
CY = 0
A= 0100 0010
A= 0001 1000
CY = 0
A= 0000 1100
uma RAR d
Uma CMP executada pelo SAP-3 como se mostra a seguir. O contedo do acumulador
copiado num registrador temporrio. Ento, o contedo do registrador especificado subtrado do
contedo do registrador temporrio. Como a ULA executa a subtrao, o flag de zero afetado. Se
os dois bytes em comparao so iguais, o flag de zero setado. Se os bytes no so iguais, o
flag de zero zerado. Como se usa o registrador temporrio, o contedo do acumulador no
afetado por uma instruo CMP .
Por exemplo, se
A = F8H
D = F8H
Z=0
14
A CMP no tem efeito nenhum sobre A e D; apenas o flag se altera para indicar que A e D so
iguais. (Se eles fossem diferentes, Z seria 0.)
CMP uma instruo poderosa porque nos permitir comparar o contedo do acumulador com
um dado num registrador especfico. Usando uma CMP juntamente com uma instruo de salto
condicional, poderemos controlar laos de uma nova maneira. Isto ser ilustrado em programas
posteriores.
12-6 IMEDIATAS ARITMTICAS E LGICAS
At agora, ns apresentamos as seguintes instrues aritmticas e lgicas: ADD, ADC, SUB,
SBB, ANA, ORA, XRA e CMP .Nestas instrues o acumulador aparece como um registrador
implcito e o registrador de onde provm dados explicitamente especificado (A, B, C, D, E, H ou
L).
As instrues imediatas do SAP-2 que aparecem tambm no SAP-3 so ANI, ORI e XRI que tm
formatos
ANI byte
ORl byte
XRI byte
onde o byte imediato submetido a uma operao lgica AND, OR ou XOR com o byte do
acumulador .
Alm destas, o SAP-3 tem ainda as seguintes instrues imediatas:
ADI byte
ACI byte
SUl byte
SBI byte
CPI byte
A instruo ADI adiciona o byte imediato ao byte do acumulador. A instruo ACI adiciona o byte
imediato e o flag de CY ao byte do acumulador. A SUl subtrai o byte Imediato do byte do
acumulador. A SBI subtrai o byte imediato e o flag CY do byte do acumulador. A CPI compara o
byte imediato com o byte do acumulador setando o flag de zero se eles forem iguais ou zerando o
flag de zero se eles forem diferentes.
EXEMPLO 12-2
Escreva um programa que subtraia 700 de 900 e armazene a resposta nos registradores H e L.
SOLUO
Ns precisamos de bytes duplos para representar 700 e 900 da seguinte forma:
90010= 0384H = 0000 0011 1000 01002
70010= 02BCH = 0000 0010 1011 11002
15
Instruo
MOV A,84H
SUI BCH
MOV L,A
MVI A, 03H
SBI 02H
MOV H,A
Comentrio
;Carregar o BI de 900
; Subtrai o BI de 700
; Guardar o BI da resposta
;Carrega o BS de 900
; Subtrai o BS de 700 com o emprestado
;Guardar o BS da resposta
Neste ponto
CY = 1
A = C8H
(Salto incondicional)
(Saltar se menos)
(Saltar se zero)
(Saltar se no zero)
16
JP endereo
produz um salto para o endereo especificado se o flag de sinal estiver zerado.
JC e JNC
A instruo
JC endereo
significa saltar para o endereo especificado se o flag de transporte (carry) estiver setado. Em
poucas palavras, JC significa saltar se transporte ( jump if carry). De forma semelhante,
JNC endereo
significa saltar para o endereo especificado se o flag de transporte (carry) no estiver setado. Isto
, saltar se no transporte (jump if no carry ).
Aqui est um programa que ilustra JC e JNC :
Rtulo
REPEAT:
ESCAPE:
Instruo
MVI A,FEH
ADI 01H
JNC REPEA T
MVI A,C4H
JC ESCAPE
.
.
.
MOVL,A
Comentrio
A MVI carrega o acumulador com FEH. A ADI adiciona 1 para totalizar FFH. Como no houve
transporte, a JNC leva o programa de volta para o ponto REPEA T (repetir) onde uma segunda
ADI executada. Desta vez o acumulador estoura, resultando um contedo de 00H com um bit de
transporte (carry) setado. Como o flag CY est setado, o programa passa pela JNC. O acumulador
carregado com C4H e, ento, a JC produz um salto para o ponto ESCAPE (escapar) onde o C4H
carregado no registrador L.
JPE e JPO
Alm dos flags de sinal, zero e transporte, o SAP-3 tem um flag de paridade chamado P. Durante
a execuo de certas instrues (como ADD, INR etc.) o resultado da ULA vrificado quanto
paridade. Se o resultado tiver um nmero par de 1s, o flag de paridade ser setado; se tiver um
nmero mpar, o flag ser zerado.
A instruo
JPE endereo
produz um salto para o endereo especificado quando o flag de paridade est setado (paridade
par). Por outro lado,
17
JPO endereo
resulta num salto quando o flag de paridade est zerado (paridade mpar). Por exemplo, dados os
seguintes flags,
S = 1 Z =0 CY = 0
P=1
o programa saltaria se encontrasse uma instruo JPE mas no o faria se tratasse de uma
instruo JPO.
A propsito, acabamos de discutir todos os flags do SAP-3. Para uma compatibilidade
ascendente com o microprocessador 8085, estes flags so armazenados no registrador F, como se
mostra na Fig.12-5. Por exemplo, se o contedo do registrador F
F= 0100 0101
ento, ns sabemos que os flags so
S=0
S
Z=1
P=1
CY = 1
CY
EXEMPLO 12-3
Que faz o seguinte segmento de programa?
SOLUO
Rtulo
LOOP:
Instruo
MVI E,00H
INR E
MOV A,E
CPI FFH
JNZ LOOP
Comentrio
;Inicializar contador
;Incrementar contador
;Carregar A com E
;Comparar com 255
;Retomar se no for 255
O registrador E est sendo usado como um contador. Ele comea em 0. Na primeira vez em que
INR e MOV so executadas
A= 01H
Depois da execuo da CPI, o flag de zero 0 porque 01H e FFH no so iguais. A JNZ fora,
ento, o programa a voltar ao ponto LOOP (lao).
O lao continua at que a INR e a MOV tenham sido executadas 255 vezes, quando, ento,
A= FFH
Desta vez, a CPI seta o flag de zero porque os bytes do acumulador e o imediato so iguais. Com
o flag de zero setado, o programa passa pela instruo JNZ.
Voc percebe o ponto que estamos discutindo? O computador executar o lao 255 vezes antes
que ele passe pela JNZ. Um uso para este segmento de programa gerar um retardo de tempo.
Um outro uso inserir instrues adicionais dentro do lao, como a seguir:
18
Rtulo
Instruo
MVI E,00H
.
.
.
INR E
MOV A,E
CPI FFH
JNZ LOOP
LOOP:
Comentrio
As instrues do incio do lao (simbolizadas por pontos) sero executadas 255 vezes. Se voc
desejar alterar o nmero de repeties do lao, modifique a instruo CPI de modo adequado.
12-8 INSTRUES DE REGISTRADOR COM EXTENSO
Algumas instrues do SAP-3 usam pares de registradores da UCP para processar dados de 16
bits. Em outras palavras, durante a execuo de certas instrues, a UCP tem seus registradores
encadeados aos pares como se mostra na Fig. 12-6. Esta encadeamento sempre feito como se
mostra: B com C, D com E, e H com L. A seguir, veremos as instrues do SAP-3 que usam pares
de registradores. Nestas instrues, voc notar a letra X, que significa registrador com extenso,
um lembrete de que pares de registradores esto envolvidos.
B
19
B = 90H
C= FFH
Enxergando B e C encadeados como na Fig. 12-6, podemos escrever
BC = 90FFH
Instrues DAD
DAD significa dupla-adio. Esta instruo tem as formas:
DAD B
DAD D
DAD C
Onde B significa BC
D significa DE
H significa H L
A instruo DAD adiciona o contedo do par especificado de registradores ao contedo do par HL
de registradores depositando o resultado no par HL de registradores. Por exemplo, se
BC = F521H
HL = 0003H
a execuo de uma DAD B produz
HL = F524H
Como voc v, F521H e 0003H so adicionados para dar F524H, que depositado no par HL de
registradores.
A instruo DAD afeta o flag de transporte CY (carry). Se h um transporte do par HL de
registradores, o flag CY setado; se no, ele zerado. Por exemplo, se
DE = 0001H
HL = FFFFH
uma DAD D dar
HL = 0000H
CY = 1
A propsito, uma DAD H tem o efeito de produzir uma adio do contedo de HL a ele mesmo. Em
outras palavras, uma DAD H duplica o valor de HL. Se
HL = 1234H
uma DAD H dar
HL = 2468H
INX e DCX
INX significa incrementar o registrador com extenso e DCX significa decrementar o registrador
com extenso. As instrues de incremento so
20
INXB
INXD
INXH
onde B significa BC
D significa DE
H significa HL
As instrues DCX tm um formato similar: DCX 8, DCX D e DCX H.
As instrues INX e DCX no tm efeito nenhum sobre os flags. Por exemplo, se
BC = FFFFH
S=1
Z=0
P=1
CY = 0
a execuo de uma INX B resulta em
BC = 0000H
S=1
Z=0
P=1
CY = 0
Observe que todos os flags permanecem inalterados.
Em resumo, as instrues de registrador com extenso so: LXI, DAD, INX e DCX . Dos trs
pares de registradores, o par HL especial, conforme veremos na prxima seco.
12--9 INSTRUES INDIRETAS
Como foi discutido no Captulo 10, o contador de programa um apontador de instruo, porque
ele aponta a posio de memria onde a prxima instruo est armazenada.
O par HL de registradores diferente; ele aponta as posies de memria onde os dados esto
armazenados. Em outras palavras, o SAP-3 tem diversas instrues onde o par HL atua como um
apontador de dados. As discusses seguintes iro explicar melhor a idia.
Visualizando o Apontador HL
A Fig. 12.7a mostra uma memria de 64K que tem 65.636 registradores ou posies de memria
onde os dados so armazenados. A primeira posio de memria M0000H, a seguinte M0001H e
assim por diante. A posio de memria com endereo HL MHL.
21
Com algumas instrues do SAP-3, o par de registradores HL usado como endereo de dado
da memria. Isto , o contedo do par HL de registradores enviado para o registrador de
endereo de memria (REM) e, ento, uma leitura ou escrita de memria executada. como se
o par HL de registradores estivesse apontando para a posio desejada de memria como se
mostra na Fig.12.7a.
Por exemplo, suponha que
HL = 2050H
Se H L estiver atuando como apontador, o seu contedo (2050H) ser enviado para o REM
durante um estado T. Durante o prximo estado T, a posio de memria cujo endereo 2050H
sofrer uma leitura ou escrita. Como se mostra na Fig. 12.7 b , o par HL de registradores aponta
para a posio desejada de memria.
Endereamento Indireto
Com endereamento direto como em LDA 5000H e STA 6000H, o programador conhece o
endereo da posio de memria porque a prpria instruo d diretamente o endereo, Com
instrues que usam o apontador HL, entretanto, o programador desconhece o endereo; tudo o
que ele sabe que o endereo est armazenado no par HL de registradores. Sempre que uma
instruo usa o apontador HL, o seu modo de endereamento chamado de endereamento
indireto.
Leitura Indireta
Uma das instrues indiretas M
MOV reg,M
onde reg = A,B,C,D,E,H ou L
M = MHL
Esta instruo manda carregar o registrador especificado com o contedo da posio e memria
endereada por HL. Depois da execuo desta instruo, o registrador especificado conter MHL.
22
Por exemplo, se
HL = 3000H
a execuo de
M3000H = 87H
MOV C,M
produz
C= 87H
A Fig. 12.8a mostra como visualizar a MOV C,M. O apontador HL aponta para 87H que o dado a
ser lido da memria e posto em C.
Como outro exemplo, se
HL = 9850H
M9850H = CEH
23
Instrues imediato-indiretas
Algumas vezes desejamos escrever dados imediatos na posio de memria endereada pelo
apontador HL. A instruo a ser usada neste caso
MVI M,byte
Aqui est um exemplo. Se HL = 3000H, a execuo de uma
MVI M,87H
Produz
M3000H = 87H
Outras Instrues com Apontador
Aqui esto mais algumas instrues que usam o apontador HL:
ADD M
ADC M
SUB M
SBB M
INR M
DCR M
ANA M
ORA M
XRA M
CMP M
24
Em cada uma delas, M a posio de memria endereada por HL. Pense como se M fosse um
outro registrador onde o dado est armazenado. Cada uma das instrues acima opera sobre este
dado como foi descrito antenriomente.
EXEMPLOl2-4
Suponha que 256 bytes de dados esto armazenados na memria entre as posies 2000H e
20FFH. Escreva um programa que copia estes 256 bytes nos endereos 3000H e 30FFH.
SOLUO
Rtulo
LOOP:
Instruo
LXI H, 1FFFH
INX H
MOV B,M
MOV A,H
ADI 10H
MOV H,A
MOV M,B
SUI 10H
MOV H,A
MOV A,L
CPI FFH
JNZ LOOP
HLT
Comentrio
;Inicializar apontador
;Incrementar apontador
;Ler um byte
;Carregar 20H no acumulador
; Adicionar a diferena para obter 30H
;Restaura H para prxima leitura
;Escrever o byte na nova posio
;Subtrair diferena
;Restaurar H para a prxima leitura
;Preparar a comparao
;Testar se 255
;Se no, obter prximo byte
;Parar
Este programa em lao transfere cada byte sucessivo da rea 2000H-20FFH da memria para a
rea 3000H-30FFH. Aqui esto os detalhes.
A LXI inicializa o apontador com o endereo 1FFFH. Na primeira vez que o lao executado, a
INX incrementar o apontador HL para 2000H. Ento, a MOV B,M l o primeiro byte transferindo-o
para o registrador B. As trs instrues seguintes
MOV A,H
ADI 1OH
MOV H,A
fazem o apontador sofrer um incremento para 3000H. Ento, a MOV M,B escreve o primeiro byte
na posio 3000H. As duas instrues seguintes, SUl e MOV, restauram o valor do apontador HL
com 2000H. A MOV A,L coloca 00H no acumulador. Como a CPI FFH zera o flag de zero, a JNZ
faz o programa voltar ao ponto de entrada no LOOP (lao ).
Na segunda vez, o computador ler o byte em 2001H e armazenar este byte em 3001H. O lao
continuar com bytes sucessivos sendo movidos de 2001H-20FFH para 3000H-30FFH. Como o
primeiro byte lido de 2000H, o byte 256 ser lido de 20FFH. Depois deste byte ter sido
armazenado em 30FFH, o apontador ser atualizado com o valor 20FFH. A MOV A,L ento
carrega o acumulador com
A= FFH
Desta vez, a CPI FFH ir setar o flag de zero e, portanto, o programa passar pela JNZ chegando
HLT.
25
Fig. 12-9 (a) A pilha do SAP-2;(b) exemplo de uma pilha; (c) apontador de pilha endereando a pilha; (d) SP aponta para
20FFH.
26
27
Fig. 12-10 Operao de empilhar;(a) primeiro,o byte superior ;(b) a seguir, o byte inferior ;(c) 6 bytes empilhados na pilha
;(d) desempilhando um byte da pilha; (e) Incrementando o apontador de pilha.
Instroes POP
Aqui esto quatro instrues pop (desempilhar)
POPB
28
POPD
POPH
POP PSW
onde B significa BC
D significa DE
H significa HL
PSW significa palavra de status de programa.
Quando uma POP (desempilhar) executada, acontece o seguinte:
1. O byte inferior lido da posio de memria endereada pelo apontador de pilha. Este byte
armazenado na parte inferior do par especificado de registradores.
2. O apontador de pilha incrementado.
3. O byte superior lido e armazenado na parte superior do par especificado de registradores.
4. O apontador de pilha incrementado.
Aqui est um exemplo. Suponha que a pilha esteja carregada como na Fig. 12-10c com o
apontador de pilha 20FAH. Ento, a execuo de uma POP B faz o seguinte:
1. O byte 25H lido de 20FAH (Fig. 12-10c) e armazenado no registrador C.
2. O apontador de pilha incrementado para 20FBH. O byte 9AH lido de 20FBH (Fig. 12-10d) e
armazenado no registrador B. O par BC de registradores contm agora
BC = 9A25H
3. O apontador de pilha incrementado para 20FCH (Fig. 12-10e).
Cada vez que executamos uma POP, 2 bytes so desempilhados. Se executssemos uma POP
PSW e uma POP H na Fig. 12-10e, o contedo final de cada registrador seria
AF = 5678H
H L = 1234H
e o apontador de pilha conteria
SP = 2100H
CALL e RET
A finalidade principal da pilha do SAP-3 guardar endereos de retomo quando se usa CALLs
Quando uma
CALL endereo
executada, o contedo do contador de programa empilhado. Ento, o endereo inicial da subrotina colocado no contador de programa. Desta forma, a prxima instruo buscada a primeira
instruo da sub.rotina. Quando a sub-rotina termina, uma instruo RET desempilha o endereo
de retomo colocando-o no contador de programa.
Aqui est um exemplo:
29
Endereo
2000H
2001H
2002H
2003H
2004H
2005H
2006H
.
.
.
20FFH
.
.
.
8050H
.
.
8059H
Instruo
LXI SP,2100H
CALL 8050H
MVI A,0EH
.
.
.
HLT
.
.
.
RET
Para comear, quando montadas, as instrues LXI e CALL ocupam 3 bytes cada uma: um byte
para o cdigo de operao e 2 para os dados. Assim sendo, a LXI ocupa as posies 2000H a
2002H e a CALL ocupa as posies 2003H a 2005H.
A LXI carrega o apontador de pilha com 2100H. Durante a execuo de CALL 8050H, o
endereo da prxima instruo (2006H) guardado na pilha da forma usual; o apontador de pilha
decrementado e o byte superior 20H armazenado; a seguir, o apontador de pilha
decrementado novamente e o byte inferior 06H armazenado (ver Figo 12-11a). Ento, o contador
de programa carregado com 8050H, que o endereo inicial da sub-rotina.
Quando a sub-rotina estiver terminada, a instruo RET levar o computador de volta ao
programa principal. Em primeiro lugar, o byte inferior desempilhado e posto na poro inferior do
contador de programa; ento, o byte superior desempilhado e posto na poro superior do
contador de programa. Depois do segundo incremento, o apontador de pilha est novamente com
valor 2100H, como se mostra na Fig. 12-11b.
Fig. 12-11 (a) Guardando um endereo de retorno durante uma chamada de sub-rotina; (b) desempilhando o endereo de
retorno durante uma RET .
30
Durante a execuo das instrues CALL e RET, a operao com a pilha automaticamente
realizada pelo computador. Tudo o que precisamos fazer inicializar o apontador e pilha usando
especialmente a instruo LXI SP ,duplo. Ela ajusta limite superior da pilha. Ento, uma instruo
CALL automaticamente empilhar o endereo de retorno e uma RET o desempilhar.
Chamadas e Retornos Condicionais de Sub-rotinas
Aqui est uma lista das chamadas condicionais de sub-rotinas do SAP-3:
CNZ endereo
CZ endereo
CNC endereo
CC endereo
CPO endereo
CPE endereo
CP endereo
CM endereo
Elas so semelhantes aos saltos condicionais discutidos anteriormente. A CNZ saltar uma subrotina apenas se o flag de zero estiver zerado, a CZ saltar apenas se o flag de zero estiver
setado, a CNC saltar apenas se o flag de transporte estiver zerado e assim por diante.
O retomo de uma sub-rotina tambm pode ser condicional. Aqui est uma a dos retornos
condicionais
RNZ
RZ
RNC
RC
RPO
RPE
RP
RM
A RNZ ir retomar apenas se o flag de zero estiver zerado, a RZ retomar apenas o flag de zero
estiver setado, a RNC retomar apenas se o flag de transporte estiver zerado assim por diante.
EXEMPLO 12-5
O SAP-3 tem a mesma frequencia de 1MHz do SAP-2. Escreva um programa que era um retardo
de tempo de 80 ms aproximadamente.
SOLUO
Rtulo
LOOP:
Mnemnico
LXI SP,E000H
MVI E,08H
CALL F020H
DCR E
JNZ LOOP
HLT
Comentrio
;lnicializar o apontador de pilha
;lnicializar o contador
;Retardo de 10 ms
;Decrementar
;Testar se j se deram 8 passagens
Quase sempre se usa sub-rotinas em programas de porte. Isto significa que se usa pilha para
guardar os endereos de retorno. Por esta razo, uma das primeiras instrues de qualquer
programa uma LXI SP usada para inicializar o apontador de pilha.
31
O programa para o retardo de 80 ms comea com uma instruo LXI SP,E000H .Isto significa
que a pilha cresce a partir do endereo DFFFH em direo aos endereos inferiores da memria.
Em outras palavras, o apontador de pilha decrementado antes da primeira operao de empilhar
significando, portanto, que a pilha comea em DFFFH.
O restante do programa trivial. O registrador E usado como contador. O programa chama 8
vezes a sub-rotina de 10 ms de retardo. Portanto, o retardo total de tempo 80ms
aproximadamente.
GLOSSRIO
Apontador de dados: Outro nome dado ao par HL de registradores quando algumas instrues
usam para enderear a memria.
Apontador de pilha (SP): Um registrador de 16 bits que enderea a pilha. Antes de se chamar
qualquer sub-rotina, o apontador de pilha deve ser inicializado por uma instruo LXI.
Desempilhar (POP): Ler dados da pilha.
Empilhar (PUSH): Guardar dados na pilha.
Endereamento indireto: Forma de endereamento onde o endereo do dado est contido no par
de registradores HL.
Excesso ou estouro: Uma condio que indica que uma soma ou diferena caiu fora do intervalo
normal de trabalho do acumulador.
Pilha: Uma poro da memria reservada para dados e endereos de retomo.
Registrador com extenso: Um par de registradores de UCP que, em algumas instrues, atua
como um registrador de 16 bits.
EXERCClOS DE FIXAO
Leia cada um dos itens seguintes e preencha os claros com a palavra correta. As resposta
aparecem no comeo da questo seguinte.
1. Uma condio de ______________ ocorre com uma soma ou diferena que cai fora do
intervalo normal de trabalho do acumulador. Uma maneira de detectar um estouro ou
excesso com o flag de ______________ .
2. (excesso ou estouro, transporte) Para zerar o flag CY de transporte, voc pode usar
uma ______________ seguida por uma CMC. STC significa o flag de
______________ transporte.
3. (STC, setar) A instruo ADC adiciona o flag de ______________ e o contedo do
registrador especificado ao contedo do ______________. SBB significa subtrair com
______________.
4. (transporte, acumulador, pede-emprestado) A RAL rotaciona todos os bits para a
______________ com o CY indo para a posio de bit menos significativo (LSB). A
RRC rotaciona os bits do acumulador para a direita com o bit menos significativo indo
para o flag CY de transporte.
5. (esquerda) A instruo CMP compara o contedo do registrador especificado com o
contedo do acumulador. Se os dois forem iguais, o flag de zero ser
______________.
A CPI compara um byte imediato com o contedo do
______________ .
6. (setado, acumulador) JM significa saltar se______________. O programa saltar para
um novo endereo se o flag de ______________ estiver setado. JNZ significa saltar se
diferente de zero.Com esta instruo, o programa salta apenas se o flag de
______________ estiver zerado.
7. (menos, sinal, zero) A instruo LXI usada para carregar pares de registradores. B
faz par com C, D com E e H com ______________. Com algumas instrues, o par HL
32
33