Você está na página 1de 59

SAP 3

Prof. Dr. Adônis Leal


Introdução
 SAP-3 é um microcomputador de 8 bits que
é, no sentido ascendente, compatível com o
microprocessador 8085.
 Além das instruções do SAP-2, novas
instruções serão acrescentadas.

UFPA - Prof. Adônis Leal


MODELO DE PROGRAMAÇÃO

UFPA - Prof. Adônis Leal


Qual é a vantagem de se dispor de
mais registradores?

 Como você se recorda, as instruções MOV e


MVI usam menos estados T do que as
instruções que fazem referência à memória
(IRM). Os registradores extras na UCP
significam que você pode usar mais instruções
MOV e MVI e menos IRMs. Por isso, os
programas do SAP-3 podem rodar mais
rapidamente do que os do SAP-2. Além disto,
a escrita dos programas se torna mais simples
por se dispor de mais registradores.

UFPA - Prof. Adônis Leal


Qual é a vantagem de se dispor de
mais registradores?

UFPA - Prof. Adônis Leal


Instruções Sap 3
 Instruções de registradores
 Instruções aritméticas
 Incrementos, decrementos e rotações
 Instruções lógicas
 Instruções de desvio de programa
 Instruções de registradores extendidos
 Instruções de endereçamento indireto
 Instruções de manipulação de pilha
 Instruções de empilhamento
 Instruções de desempilhamento
 Chamadas e retornos de sub-rotinas
UFPA - Prof. Adônis Leal
Instruções de registradores

UFPA - Prof. Adônis Leal


Instruções aritméticas
 Dados de 8 bits: resultados sem sinal de 0 a
255, e com sinal de -128 a +127.

UFPA - Prof. Adônis Leal


Instruções aritméticas

 Flag de Transporte.
 O flag de transporte CY (Carry), pode

ser “vai-um” (na adição) ou “vem-um”


(na subtração). A interpretação
depende da operação.

UFPA - Prof. Adônis Leal


Instruções aritméticas

A B

TS TE
CY = CARRY para instruções ADD (SUB = 0)
CY = CARRY para instruções SUB (SUB = 1)
UFPA - Prof. Adônis Leal
Exemplos
 11111111  00000011
 + 00000001  - 00000001
 =  =

 00111111  00000011
 + 00000001  - 00000111
 =  =

UFPA - Prof. Adônis Leal


Instruções aritméticas
 A soma de 8 bits S7 S6 S5 S4 S3 S2 S1 S0 é
armazenada no acumulador. O transporte (vai-um ou
vem-um} é armazenado num flip-flop especial chamado
flag de transporte designado CY. Este flag
funciona como se fosse um bit superior adicional do
acumulador.

 Na adição, CY é chamado de “vai-um”. Na subtração,


CY é chamado de “vem-um” ou “pede emprestado”. O
transporte CY funciona como um bit adicional do
acumulador (CY = A8).
UFPA - Prof. Adônis Leal
Instruções aritméticas
 Instruções para o Flag de Transporte.

 A instrução STC seta o flag CY se ele já não estiver setado.


(STC significa setar transporte, do ingles "set carry").
 A instrução CMC complementa ou inverte o valor de CY. Se CY
=1 , então uma CMC produz CY = 0. Por outro lado, se CY = 0,
então uma CMC produz CY = 1.
 Se você deseja zerar o flag de transporte e desconhece seu
valor atual, deve setá-lo e, então, complementá-lo. Isto é, a
execução de

 STC
 CMC

UFPA - Prof. Adônis Leal


Instruções aritméticas
 Exemplos do uso do Flag de transporte.

UFPA - Prof. Adônis Leal


Complemento de 2

UFPA - Prof. Adônis Leal


Complemento de 2 - Exemplo
0 0 0 0 0 0 0 1

1 1 1 1 1 1 1 0
1

A B

TS TE

UFPA - Prof. Adônis Leal


Instruções aritméticas
 Exemplos do uso do Flag de transporte.

UFPA - Prof. Adônis Leal


Instruções aritméticas
 Exemplos do uso do Flag de transporte.
Exercício 1
 Na aritmética dos números 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.

UFPA - Prof. Adônis Leal


Solução 1

UFPA - Prof. Adônis Leal


Solução 1

UFPA - Prof. Adônis Leal


Exercício 2
 Escreva um programa para subtrair 70010 de
90010, e colocar o resultado nos registradores H
e L.

UFPA - Prof. Adônis Leal


Solução 2

Instrução Comentário
MVI A,84H ;Carrega o byte inferior de 900 em A
SUI BCH ;Subtrai o byte inferior de 700 de A
MOV L,A ;Salva o byte inferior do resultado
MVI A,03H ;Coloca o byte superior de 900 em A
SBI 02H ;Subtrai o byte superior de 700 e CY
MOV H,A ;Salva o byte superior do resultado
HLT

UFPA - Prof. Adônis Leal


Incrementos, decrementos e
rotações

Sintaxe Operação Bytes


INR reg (reg)  (reg) + 1 1
DCR reg (reg)  (reg) - 1 1
(Ai)  (Ai-1); (A0)  (CY); (CY)
RAL  (A7) 1

(Ai-1)  (Ai); (A7)  (CY); (CY)


RAR  (A0) 1

(Ai)  (Ai-1); (A0)  (A7); (CY) 1


RLC  (A7)
(Ai-1)  (Ai); (A7)  (A0); (CY) 1
RRC  (A0)

UFPA - Prof. Adônis Leal


Incrementos, decrementos e
rotações
 As instruções INR e DCR afetam os flags de
sinal e de zero (S e Z), mas não afetam o flag
de transporte CY.

 O flag de transporte CY permanece inalterado


mesmo que ocorra um “estouro” no registrador
incrementado.

UFPA - Prof. Adônis Leal


Incrementos, decrementos e
rotações

UFPA - Prof. Adônis Leal


Incrementos, decrementos e
rotações

UFPA - Prof. Adônis Leal


Rotações - Exercício
 Faça um programa para multiplicar 5 x 8
utilizando instruções de rotação.

UFPA - Prof. Adônis Leal


Instruções lógicas

Sintaxe Operação Bytes


ANA reg (A)  (A) AND (reg) 1
ANI byte (A)  (A) AND byte 2
ORA reg (A)  (A) OR (reg) 1
ORI byte (A)  (A) OR byte 2
XRA reg (A)  (A) XOR (reg) 1
XRI byte (A)  (A) XOR byte 2
Z = 1 se (A) = (reg);
CMP reg Z = 0 se (A)  (reg) 1

Z = 1 se (A) = byte;
CPI byte Z = 0 se (A)  byte 2

UFPA - Prof. Adônis Leal


Instruções lógicas
 A CMP compara o conteúdo de um registrador especificado com o conteúdo do
acumulador. O flag de zero indica o resultado desta comparação da seguinte forma:

 Para a execução de CMP reg, (A) é copiado para o registrador TMP. Então a ULA
faz (TMP) – (reg), afetando o flag Z.

 Por isso, se (A) = (reg), então Z=1, e se (A) (reg), então Z=0. Como é usado o
registrador TMP, a instrução CMP não afeta o conteúdo do acumulador ou de reg.

 A instrução CMP, usada com uma instrução JZ, permite controlar laços de uma nova
maneira (com o contador crescendo).

 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.
Exercício 3
Escreva um programa para executar um loop
255 vezes baseado nas instruções de
comparação e incremento.

UFPA - Prof. Adônis Leal


Resolução 3
 Loop/Contador com a instrução de
comparação.

Rótulo Instrução Comentário


MVI E,00H ;Inicializar o contador
LOOP: ...
...
INR E ;Incrementar o contador
MOV A,E ;Copiar E para A
CPI FFH ;Comparar A com 255
JNZ LOOP ;Repetir se A não for 255

UFPA - Prof. Adônis Leal


Instruções de desvio de programa

Sintaxe Operação Bytes


JMP endereço (PC)  endereço 3
JM endereço S = 1: (PC)  endereço; 3
S = 0: (PC)  (PC) + 1
JP endereço S = 0: (PC)  endereço; 3
S = 1: (PC)  (PC) + 1
JZ endereço Z = 1: (PC)  endereço; 3
Z = 0: (PC)  (PC) + 1
JNZ endereço Z = 0: (PC)  endereço; 3
Z = 1: (PC)  (PC) + 1
JC endereço CY = 1: (PC)  endereço; 3
CY = 0: (PC)  (PC) + 1
JNC endereço CY = 0: (PC)  endereço; 3
CY = 1: (PC)  (PC) + 1
JPE endereço P = 1: (PC)  endereço; 3
P = 0: (PC)  (PC) + 1
JPO endereço P = 0: (PC)  endereço; 3
P = 1: (PC)  (PC) + 1

UFPA - Prof. Adônis Leal


Instruções de desvio de programa

 JPE e JPO desviam com base no flag de paridade P:


 P=1: o resultado da ULA tem um número par de 1’s.
 P=0: o resultado da ULA tem um número ímpar de 1’s.

 JMP endereço (Salto incondicional)


 JM endereço (Saltar se Negativo)
 JP endereço (Saltar se Positivo)
 JZ endereço (Saltar se zero)
 JNZ endereço (Saltar se não zero)

 JC endereço significa saltar para o endereço especificado se o


flag de transporte (carry) estiver setado.
 JNC endereço significa saltar para o endereço especificado se
o flag de transporte (carry) não estiver setado.

UFPA - Prof. Adônis Leal


Instruções de registradores estendidos

Sintaxe Operação Bytes


LXI B,word (B)  byte superior; 3
(C)  byte inferior
LXI D,word (D)  byte superior; 3
(E)  byte inferior
LXI H,word (H)  byte superior; 3
(L)  byte inferior
DAD B (HL)  (HL) + (BC) 1 B C
DAD D (HL)  (HL) + (DE) 1 D E
DAD H (HL)  (HL) + (HL) 1
INX B (BC)  (BC) + 1 1 H L
INX D (DE)  (DE) + 1 1
INX H (HL)  (HL) + 1 1
DCX B (BC)  (BC) - 1 1
DCX D (DE)  (DE) - 1 1
DCX H (HL)  (HL) - 1 1
UFPA - Prof. Adônis Leal
Exercício 4
 Escreva um programa do SAP-3 que adiciona
700 com 900 e coloca a resposta nos
registradores H e L. Utilize instruções de
registradores estendidos.

UFPA - Prof. Adônis Leal


Instruções de endereçamento indireto

 São instruções que usam o conteúdo do par HL


como o endereço de um dado na memória, isto é,
(HL) é enviado para o REM, para que seja feita
uma leitura ou escrita na memória.
 Essas instruções usam o modo de
endereçamento indireto, pois o endereço é uma
variável, que pode mudar no decorrer do
programa. Podem-se fazer cálculos com os
endereços.
 Por outro lado, no endereçamento direto, os
endereços são constantes (por exemplo, LDA
5000H ou STA 2000H).

UFPA - Prof. Adônis Leal


Instruções de endereçamento indireto

 Sintaxe Operação Bytes


MOV reg,M (reg)  ((HL)) 1
MOV M,reg ((HL))  (reg) 1
MVI M,byte ((HL))  byte 2
ADD M (A)  (A) + ((HL)) 1
ADC M (A)  (A) + ((HL)) + (CY) 1
SUB M (A)  (A) - ((HL)) 1
SBB M (A)  (A) - ((HL)) - (CY) 1
INR M ((HL))  ((HL)) + 1 1
DCR M ((HL))  ((HL)) - 1 1
ANA M (A)  (A) AND ((HL)) 1
ORA M (A)  (A) OR ((HL)) 1
XRA M (A)  (A) XOR ((HL)) 1
CMP M Z = 1 se (A) = ((HL));
1
Z = 0 se (A) ((HL))
UFPA - Prof. Adônis Leal
Exercício 5
 Suponha que 256 bytes de dados estão
armazenados na memória entre as posições
2000H e 20FFH. Escreva um programa que
copia estes 256 bytes nos endereços 3000H e
30FFH.

UFPA - Prof. Adônis Leal


Solução 5

UFPA - Prof. Adônis Leal


Instruções de manipulação de pilha

 Instruçõesde empilhamento
 Instruções de desempilhamento

 Uma pilha é uma porção da memória


reservada primariamente para guardar
endereços de retorno.
 O SAP-2 tem uma pequena pilha porque os
endereços FFFEH e FFFFH são usados
exclusivamente para guardar um endereço de
retomo de sub-rotina.

UFPA - Prof. Adônis Leal


Instruções de manipulação de pilha
O SAP-3 é diferente.
 O programador decide onde colocar a pilha
dentro da memória e de que tamanho ela deve
ser.

UFPA - Prof. Adônis Leal


Instruções de manipulação de pilha

 Um registrador de 16 bits da UCP, chamado


de SP (Stack Pointer ou Apontador de Pilha),
tem a função de indicar a posição de memória
na pilha que deve ser acessada (lida ou
escrita) pelas instruções de pilha.
 O apontador de pilha é inicializado com uma
instrução de carga imediata:
 LXI SP, word

UFPA - Prof. Adônis Leal


Instruções de empilhamento

 Os conteúdos do acumulador e do registrador de flags são


denominados conjuntamente de PSW (Program Status Word
ou Palavra de Estado de Programa).

 PSW = (A)(F)

 Quando se vai chamar uma sub-rotina, pode ser necessário


guardar antes a PSW, para que o programa principal possa
prosseguir de forma correta depois que a sub-rotina retornar.

 Pode ser necessário guardar também os conteúdos dos


demais registradores, antes do início da sub-rotina. Isso
preserva todo o estado da CPU antes da execução da sub-
rotina.
UFPA - Prof. Adônis Leal
Instruções de empilhamento

 A instrução de empilhamento é PUSH, que guarda


dados na pilha. Há quatro instruções PUSH, que
enxergam os registradores aos pares (‘B’ = BC, ‘D’ =
DE, ‘H’ = HL).
 As instruções PUSH empilham sempre palavras de 16
bits, primeiro o byte superior e depois o byte inferior.
Sintaxe Operação Bytes
(SP)  (SP) – 1; ((SP))  (B);
PUSH B 1
(SP)  (SP) – 1; ((SP))  (C)
(SP)  (SP) – 1; ((SP))  (D);
PUSH D 1
(SP)  (SP) – 1; ((SP))  (E)
(SP)  (SP) – 1; ((SP))  (H);
PUSH H 1
(SP)  (SP) – 1; ((SP))  (L)
(SP)  (SP) – 1; ((SP))  (A);
PUSH PSW 1
(SP)  (SP) – 1; ((SP))  (F)
UFPA - Prof. Adônis Leal
Instruções de empilhamento

 Exemplos de instruções PUSH

 (BC) = 5612H (SP) = 2100H


 PUSH B

1. SP é decrementado para 20FFH;


2. O byte superior 56H é guardado na memória, no endereço
20FFH ;
3. SP é decrementado para 20FEH;
4. O byte inferior 12H é guardado na memória, no endereço
20FEH.

UFPA - Prof. Adônis Leal


Instruções de empilhamento

 (SP) = 2100H, (AF) = 1234H, (DE) = 5678H, (HL) = 9A25H


 PUSH PSW
 PUSH D
 PUSH H
dados endereços
• A pilha cresce “para cima” a partir do
endereço (SP–1), no sentido
25H 20FAH decrescente dos endereços da
9AH 20FBH
78H 20FCH
memória.
56H 20FDH
34H 20FEH • SP sempre “aponta” para o último
12H 20FFH dado empilhado.

UFPA - Prof. Adônis Leal


Exercício 6
 Considerando o conteúdo dos seguintes
registradores.(SP) = 3000H, (AF) = AA34H,
(DE) = 56BBH, (HL) = 9ACCH.Monte uma
pilha no SAP 3 com as seguintes instruções.
 PUSH H
 PUSH D
 PUSH PSW

UFPA - Prof. Adônis Leal


Instruções de desempilhamento

 Fazem o inverso das instruções PUSH,


restaurando os conteúdos dos registradores
empilhados.
Sintaxe Operação Bytes
(C)  ((SP)); (SP)  (SP) + 1;
POP B 1
(B)  ((SP)); (SP)  (SP) + 1
(E)  ((SP)); (SP)  (SP) + 1;
POP D 1
(D)  ((SP)); (SP)  (SP) + 1
(L)  ((SP)); (SP)  (SP) + 1;
POP H 1
(H)  ((SP)); (SP)  (SP) + 1
(F)  ((SP)); (SP)  (SP) + 1;
POP PSW 1
(A)  ((SP)); (SP)  (SP) + 1

UFPA - Prof. Adônis Leal


Instruções de desempilhamento

 As instruções POP também enxergam os


registradores aos pares, e desempilham 2
bytes de cada vez.

 A ordem do desempilhamento é inversa à


ordem do empilhamento. A pilha opera no
modo LIFO (Last In, First Out): o último dado
que entra na pilha é o primeiro que sai.

UFPA - Prof. Adônis Leal


Instruções de desempilhamento
 Quando uma POP (desempilhar) é executada,
acontece o seguinte:

 1. O byte inferior é lido da posição de memória


endereçada 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.

UFPA - Prof. Adônis Leal


Instruções de desempilhamento

 Exemplo:
dados endereços POP B :
(C)  25H;
(SP)  20FBH;
(B)  9AH;
(SP)  20FCH.
SP  25H 20FAH
(BC) = 9A25H
9AH 20FBH
78H 20FCH
POP PSW :
56H 20FDH
(AF) = 5678H
34H 20FEH
12H 20FFH POP H:
(HL) = 1234H
UFPA - Prof. Adônis Leal
(SP) = 2100H
Chamadas e retornos de sub-rotinas

 CALL provoca o
Endereço Instrução empilhamento do endereço da
2000H LXI SP,FFFFH
próxima instrução (endereço
2001H
2002H de retorno). Então o PC é
2003H CALL 8050H carregado com 8050H e a
2004H execução vai para a sub-
2005H rotina.
2006H MVI A,0EH
... ...
20FFH HLT
... ...
... ...
8050H ...
... ...
8059H RET
UFPA - Prof. Adônis Leal
Chamadas e retornos de sub-rotinas

 A LXI carrega o apontador de pilha com FFFFH. Durante a


execução de CALL 8050H, o endereço da próxima instrução
(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. Então, o contador de programa é carregado
com 8050H, que é o endereço inicial da sub-rotina.

 Quando a sub-rotina estiver terminada, a instrução RET levará o


computador de volta ao programa principal. Em primeiro lugar, o
byte inferior é desempilhado e posto na porção inferior do contador
de programa; então, o byte superior é desempilhado e posto na
porção superior do contador de programa. Depois do segundo
incremento, o apontador de pilha está novamente com valor
FFFFH.

UFPA - Prof. Adônis Leal


Chamadas e retornos de sub-rotinas

 RET desempilha o endereço de retorno e o


devolve ao PC. SP volta a conter FFFFH.

 SP precisa ser inicializado pelo


programador com o limite superior da pilha
(seu maior endereço). É preciso ter
cuidado para que a pilha não invada a área
de programa ou outra área de dados. Ela
pode ficar no final da memória.

UFPA - Prof. Adônis Leal


Chamadas e retornos de sub-rotinas
Sintaxe Operação Bytes
CNZ endereço Z = 0: (SP)(SP)-1; ((SP))(PCH); (SP)(SP)-1; ((SP))(PCL);
(PC)  endereço. 3
Z = 1: (PC)  (PC) + 1

CZ endereço Z = 1: (SP)(SP)-1; ((SP))(PCH); (SP)(SP)-1; ((SP))(PCL);


(PC)  endereço. 3
Z = 0: (PC)  (PC) + 1

CNC endereço CY = 0: (SP)(SP)-1; ((SP))(PCH); (SP)(SP)-1; ((SP))(PCL);


(PC)  endereço. 3
CY = 1: (PC)  (PC) + 1

CC endereço CY = 1: (SP)(SP)-1; ((SP))(PCH); (SP)(SP)-1; ((SP))(PCL);


(PC)  endereço. 3
CY = 0: (PC)  (PC) + 1

CP endereço S = 0: (SP)(SP)-1; ((SP))(PCH); (SP)(SP)-1; ((SP))(PCL);


(PC)  endereço. 3
S = 1: (PC)  (PC) + 1

CM endereço S = 1: (SP)(SP)-1; ((SP))(PCH); (SP)(SP)-1; ((SP))(PCL);


(PC)  endereço. 3
S = 0: (PC)  (PC) + 1

CPE endereço P = 1: (SP)(SP)-1; ((SP))(PCH); (SP)(SP)-1; ((SP))(PCL);


(PC)  endereço. 3
P = 0: (PC)  (PC) + 1

CPO endereço P = 0: (SP)(SP)-1; ((SP))(PCH); (SP)(SP)-1; ((SP))(PCL);


(PC)  endereço. 3
P = 1: (PC)  (PC) + 1
Chamadas e retornos de sub-rotinas

Sintaxe Operação Bytes


RNZ endereço Z = 0: (PC)  ((SP+1))((SP)); 3
Z = 1: (PC)  (PC) + 1
RZ endereço Z = 1: (PC)  ((SP+1))((SP)); 3
Z = 0: (PC)  (PC) + 1
RNC endereço CY = 0: (PC)  ((SP+1))((SP)); 3
CY = 1: (PC)  (PC) + 1
RC endereço CY = 1: (PC)  ((SP+1))((SP)); 3
CY = 0: (PC)  (PC) + 1
RP endereço S = 0: (PC)  ((SP+1))((SP)); 3
S = 1: (PC)  (PC) + 1
RM endereço S = 1: (PC)  ((SP+1))((SP)); 3
S = 0: (PC)  (PC) + 1
RPE endereço P = 1: (PC)  ((SP+1))((SP)); 3
P = 0: (PC)  (PC) + 1
RPO endereço P = 0: (PC)  ((SP+1))((SP)); 3
P = 1: (PC)  (PC) + 1

UFPA - Prof. Adônis Leal


Revisão (Exercícios)
 Faça um programa para somar 820 com 1030,
Salve o resultado no par de registradores HL.
 Considerando o conteúdo dos seguintes
registradores.(SP) = 9000H, (AF) = 1234H,
(DE) = DDE1H, (HL) = 9ACCH. Monte uma
pilha no SAP 3 com as seguintes instruções.
 PUSH D
 PUSH H
 POP D
 PUSH PSW

UFPA - Prof. Adônis Leal


Duvidas?
 adonisleal1@gmail.com

UFPA - Prof. Adônis Leal

Você também pode gostar