2.5 - Instruções Lógicas do 8085 - ULA
Todas as operações lógicas e aritméticas em qualquer microprocessador são realizadas em uma unidade dedicada denominada Unidade Lógica e Aritmética (ULA). Para auxiliar nessa função, há alguns registradores conectados diretamente à ULA. No caso do 8085, esses registros são: ACUMULADOR (A ou Acc) e um REGISTRADOR TEMPORÁRIO (não disponível para uso geral via programação).
A estrutura interna do 8085 para operações gerais é apresentada na figura seguinte.
Um dos operandos das operações estará sempre armazenado no Acumulador. O outro operando, vindo dos registradores B, C, D, E, H e L ou da memória, passa necessariamente por uma transferência interna para um registrador temporário (REG TEMP). O resultado da operação é armazenado sempre no acumulador.
Quando uma operação é realizada na ULA, algumas situações particulares podem acontecer. Em tais casos os bits de estados são setados ou zerados e ficam armazenados em um registrador denominado F ou registrador de FLAGS. Estes bits podem ser utilizados para o controle e desvio de programas através de determinadas instruções. Os flags no 8085 são organizados como segue:
FLAGS
As funções dos bits de FLAGS são:
CARRY (CY) – Este flag é setado UM (1) quando o resultado de uma operação é um
número maior do que 8 bits (ESTOURO ou OVERFLOW). Caso contrário ele é zerado. Exemplo: FFH + 11H = 10H e CY=1.
PARITY (P) – Esse bit assume valor UM (1) quando o resultado de uma determinada
operação produz um valor com número de bits “1” PAR. Caso contrário ele é zerado. Exemplo: 0EH + 01H = 0FH e P=1.
AUXILIAR CARRY (AC) – O flag AC assume valor “1” quando há um VAI-UM do
terceiro para o quarto bit. Caso contrário ele é zerado. Exemplo: 05H+0CH = 11H e AC=1.
ZERO (0) caso contrário ele é zerado. Exemplo: FDH + 03H = 00H, resulta Z=1 e CY=1.
SIGNAL (S) – Assume “1” quando o resultado de uma operação produz um número
maior que 7FH (operações com sinal).
CONJUNTO DE INSTRUÇÕES LÓGICAS
Operações AND (
•) -
O flag CY é desativado (=0) e o flag AC é ativado (AC=1).14 - ANA r
And Accumulator with Register
(A) = (A) • (r) Z, S, P, AC, CY
1010 0 FFF T= 4 F
É realizada uma operação AND entre o conteúdo do registrador r e o conteúdo do Acumulador e o resultado é transferido ao acumulador.
Exemplo:
Instrução Código (Binário) Código (Hexa)
ANA B 1010 0 000 A0
ANTES: (A) = 3CH (B) = 21H APÓS: (A) = 20H (B) = 21H (F)=12H
15 - ANA M
And Accumulator with Register
(A) = (A) • ((H)(L)) Z, S, P, AC, CY
1010 0110 T = 7 F R
É realizada uma operação AND entre o conteúdo da memória endereçado pelo par HL e o conteúdo do Acumulador e o resultado é transferido ao Acumulador.
Exemplo:
Instrução Código (Binário) Código (Hexa)
ANA M 1010 0110 A6 ANTES: (H) = 20H (L) = 31H (2031H) = 7FH (A) = 37H APÓS: (2031H) = 7FH (A) = 37H (F) = 12H
16 - ANI Data8
And Immediate with Accumulator
(A) = (A) • Data8 Z, S, P, AC, CY
1110 0110 Data8
T = 7 F R
É realizada uma operação AND entre o dado Data8 e o conteúdo do Acumulador e o resultado é transferido ao Acumulador.
Exemplo:
Instrução Código (Binário) Código (Hexa)
ANI F0 1110 0110
1111 0000
E6 F0
ANTES: (A) = 37H APÓS: (A) = 30H (F)=16H
Operações OR (+
L)
Os flags CY e AC são desativados (=0).17 - ORA r
Inclusive OR Registerwith Accumulator
(A) = (A) +L (r)
Z, S, P, AC, CY
1011 0FFF
T = 4 FÉ realizada uma operação OR entre o conteúdo do registrador r e o conteúdo do Acumulador e o resultado é transferido ao acumulador.
Exemplo:
Instrução Código (Binário) Código (Hexa)
ORA B 1011 0 000 B0
18 - ORA M
Inclusive OR Memory with Accumulator
(A) = (A) +L ((H)(L)) Z, S, P, AC, CY 1011 0110 B6H T = 7 F R
É realizada uma operação OR entre o conteúdo da memória endereçado pelo par HL e o conteúdo do Acumulador e o resultado é transferido ao Acumulador.
Exemplo:
Instrução Código (Binário) Código (Hexa)
ORA M 1011 0110 B6 ANTES: (H) = 20H (L) = 31H (2031H) = 7FH (A) = 37H APÓS: (H) = 20H (L) = 31H (2031H) = 7FH (A) = 7FH (F)=02H
19 - ORI Data8
Inclusive OrImmediate with Accumulator
(A) = (A) +L Data8
Z, S, P, AC, CY
1111 0110 Data8
T = 7 F R
É realizada uma operação OR entre o dado Data8 e o conteúdo do Acumulador e o resultado é transferido ao Acumulador.
Exemplo:
Instrução Código (Binário) Código (Hexa)
ORI F1 1111 0110
1111 0001
F6 F1
ANTES : (A) = 37H APÓS: (A) = F7H (F) = 82H
Operação OR Exclusivo (
⊕ )
-
Os flags CY e AC são zerados.20 - XRA r
ExclusiveOR Registerwith Accumulator
(A) = (A) ⊕ (r) Z, S, P, AC, CY
1010 1FFF
T = 4 FÉ realizada uma operação Exclusive OR entre o conteúdo do registrador r e o conteúdo do Acumulador e o resultado é transferido ao acumulador.
Exemplo:
Instrução Código (Binário) Código (Hexa)
XRA B 1010 1 000 A8
ANTES: (A) = 3CH (B) = 21H APÓS: (A) = 1DH (F) = 06H
21 - XRA M
ExclusiveOR Memory with Accumulator
(A) = (A) ⊕ ((H)(L)) Z, S, P, AC, CY
1010 1110 T = 7 F R
É realizada uma operação XOR entre o conteúdo da memória endereçado pelo par HL e o conteúdo do Acumulador e o resultado é transferido ao Acumulador.
Exemplo:
Instrução Código (Binário) Código (Hexa)
XRA M 1010 1110 AE ANTES: (H) = 20H (L) = 31H (2031H) = 7FH (A) = 37H APÓS: (2031H) = 7FH (A) = 48H (F) = 06H
22 - XRI Data8
ExclusiveOrImmediate with Accumulator
(A) = (A) ⊕ Data8 Z, S, P, AC, CY
1110 1110 Data8
T = 7 F R
É realizada uma operação XOR entre o dado Data8 e o conteúdo do Acumulador e o resultado é transferido ao Acumulador.
Exemplo:
Instrução Código (Binário) Código (Hexa)
XRI F1 1110 1110
1111 0001
EE F1 ANTES: (A) = FCH APÓS: (A) = 0DH (F) = 02H
Operações de Complemento
23 - CMA
Complement Accumulator
(A) = (A) 0010 1111 T = 4
F
Complementa o conteúdo do Acumulador e transfere o resultado ao Acumulador. Nenhum flag é afetado.
Exemplo:
Instrução Código (Binário) Código (Hexa)
CMA 0010 1111 2F
ANTES: (A) = 3CH APÓS: (A) = 16H (F) = C3H
24 - CMC
Complement Carry CY =CY 0011 1111 3FH T= 4 FO flag CY é complementado. Nenhum outro flag é afetado.
25 - STC
Set Carry CY = 1 0011 0111 37H T = 4 F O flag CY é setadoOperações de Comparação
26 - CMP r
Compare Register with Accumulator
(A) – (r) Z, S, P, AC ,CY
1011 1 FFF T = 4 F
O conteúdo do registrador r é subtraído do Acumulador. O Acumulador não é alterado. Os flags são alterados conforme o resultado da subtração. O flag Z é setado se (A) = (r). O flag CY é setado se (A) < (r).
Exemplo:
Instrução Código (Binário) Código (Hexa)
CMP B 1011 1000 B8
ANTES: (A) = 37H (B) = 21H APÓS: (A) = 37H (F) = 12H
27 - CMP M
Compare Register with Memory
(A) – ((H)(L)) Z, S, P, AC ,CY 1011 1110 BE H T = 7 F R O conteúdo do endereço de memória dado pelo par H,L é subtraído do Acumulador. O Acumulador não é alterado. Os flags são alterados conforme o resultado da subtração. O flag Z é setado se (A) = ((H)(L)). O flag CY é setado se (A) < ((H)(L)).
Exemplo:
Instrução Código (Binário) Código (Hexa)
CMP M 1011 1110 BE ANTES: (H) = 20H (L) = 32H (2032H) = F5H (A) = 37H APÓS: (2032H) = 35H (A) =37H (F) = 17H
28 - CPI Data8
Compare Immediate (A) – (Data8) Z, S, P, AC ,CY 1111 1110 (FE H) Data8 T = 7 F R O byte Data8 é subtraído do Acumulador. O Acumulador não é alterado. Os flags são alterados conforme o resultado da subtração. O flag Z é setado se (A) = Data8. O flag CY é setado se (A) < Data8.Exemplo:
Instrução Código (Binário) Código (Hexa)
CPI 45 1111 1110
0100 0101
FE 45 ANTES: (A) = 20H APÓS: (A) = 20H (F) = 07H
Instruções de Rotação
29 - RLC
Rotate Left Accumulator
(An+1) ← (An) (A0) ← (A7) (CY) ← (A7) 0000 0111 07H T = 4 F
O conteúdo de A é deslocado de uma posição para esquerda. O bit de menor ordem e o flag CY recebem o bit de maior ordem, e o valor inicial de CY é descartado. Os demais flags não são afetados.
Exemplo:
Instrução Código (Binário) Código (Hexa)
RLC 0000 0111 07
ANTES: (A) = 20H CY = X APÓS: (A) = 40H CY = 0
30 - RAL
Rotate All Left Through Carry (An+1) ← (An) (CY) ← (A7) (A0) ← (CY) 0001 0111 (17H) T= 4 F
O conteúdo de A é deslocado de uma posição para esquerda através do Carry. O bit de menor ordem recebe o conteúdo CY e o flag CY recebe o valor do bit de maior ordem do acumulador, conforme o diagrama seguinte:
Os demais flags não são afetados.
Exemplo:
Instrução Código (Binário) Código (Hexa)
RAL 0001 0111 17
ANTES: (A) = 20H CY = 1 APÓS: (A) = 41H CY = 0
31 - RRC
Rotate Right Accumulator
(An) ← (An+1)
(A7) ← (A0)
(CY) ← (A0)
0000 1111 (0FH) T = 4 F
O conteúdo do A é deslocado de uma posição para a direita. O flag CY tem seu valor descartado e, junto com o bit A7, recebem o bit A0, conforme o diagrama seguinte:
Os demais flags não são afetados.
Exemplo:
Instrução Código (Binário) Código (Hexa)
RRC 0000 1111 0F
ANTES: (A) = 20H CY = X APÓS: ( A) = 10H CY = 0
32 - RAR
Rotate All Right Through Carry
(An) ← (An+1)
(CY) ← (A0)
0001 1111 (1FH) T = 4 F
O conteúdo de A é deslocado de uma posição à direita através do Carry. O bit de maior ordem recebe o valor do carry e o CY recebe o valor do bit de menor ordem do acumulador, conforme o diagrama seguinte:
Os demais flags não são afetados.
Exemplo:
Instrução Código (Binário) Código (Hexa)
RAR 0001 1111 1F
ANTES: (A) = 20H CY = 1 APÓS: (A) = 90H CY = 0
2.6 - CONJUNTO DE INSTRUÇÕES ARITMÉTICAS
A realização de cálculos é um ponto importante em sistemas que usam microprocessadores. O 8085 possui uma variedade de instruções para operações aritméticas, realizadas em complemento de 2 também possui uma instrução especial para a realização de operações em BCD.
A base das operações de soma e subtração são todas resumidas nas tabela seguinte: A B soma carry
0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1
Nos sistemas digitais, a subtração pode ser utilizada de maneira mais simples se for convertida em soma. O artifício usado é passar os subtraendos para complemento de dois e adicioná-los aos minuendos.
Obs: Complemento de 1: inversão de todos os bits Complemento de 2: complemento de 1 + 1
Adição
33 - ADD r
Add Acc. with Register
(A) = (A) + (r) Z, S, P, AC, CY
1000 0 FFF T = 4
F
É realizada uma soma entre o conteúdo do Acumulador e o conteúdo do registrador r.
Exemplo:
Instrução Código (Binário) Código (Hexa)
ADD B 1000 0000 80
ANTES: (A) = 21H (B) = 31H APÓS: (A) = 52H (F) = 02H
34 - ADD M
Add Acc. with Memory
(A) = (A) + ((H)(L)) Z, S, P, AC, CY 1000 0110 T = 7 F R
É realizada uma soma entre o conteúdo do Acumulador e o conteúdo da memória endereçada pelo par HL.
Exemplo:
Instrução Código (Binário) Código (Hexa)
ADD M 1000 0110 86 ANTES: (H) = 20H (L) = 33H (A) = 21H (2033) = FFH APÓS: (A) = 20H (F) = 13H
35 - ADI Data8
Add with Immediate(A) = (A) + Data8 Z, S, P, AC, CY
1100 0110 Data8
T = 7 F R
É realizada uma soma entre o conteúdo do Acumulador e o byte Data8.
Exemplo:
Instrução Código (Binário) Código (Hexa)
ADI 45 1100 0110
0010 0101
C6 45
ANTES: (A) = 21H (2033) = 45H APÓS: (A) = 66 H (F) = 06H
36 - ADC r
Add Acc.with Register and Carry
(A) = (A) + (r) + CY Z, S, P, AC, CY
1000 1 FFF T = 4 F
É realizada uma soma entre o conteúdo do Acumulador e o conteúdo do registrador r e o flag CY.
Exemplo:
Instrução Código (Binário) Código (Hexa)
ADC B 1000 1000 88
ANTES: (A) = 21H (B) = 31H (CY)=1 APÓS: (A) = 53H (F) = 06H
37 - ADC M
AddAcc. with Memory and Carry
(A) = (A) + ((H)(L)) + CY Z, S, P, AC, CY 1000 1110 T = 7 F R
É realizada uma soma entre o conteúdo do Acumulador e o conteúdo da memória endereçada pelo par HL e o flag CY.
Exemplo:
Instrução Código (Binário) Código (Hexa)
ADC M 1000 1110 8E
ANTES: (H) = 20H (L) = 33H (A) = 21H (2033) = FFH CY=1
APÓS: (A) = 21H (F) = 06H
38 - ACI Data8
Add Acc. with Immediate and Carry
A = (A) + Data8 + CY Z, S, P, AC, CY 1100 1110 Data8 T = 7 F R
É realizada uma soma entre o conteúdo do Acumulador com o byte Data8 e o flag CY.
Exemplo:
Instrução Código (Binário) Código (Hexa)
ACI 45 1100 1110
0010 0101
CE 45
ANTES: (A) = 21H (2033) = 45H CY=1 APÓS: (A) = 67H (F) = 02H
39 - DAD PR
DoubleRegister Add (H)(L) = (H)(L) + (PR) CY 00 PR 1001 T = 10 F B Bo resultado é retornado ao par HL. O flag CY é setado se houver um VAI UM na soma de dupla precisão; os demais flags não são alterados.
Exemplo:
Instrução Código (Binário) Código (Hexa)
DAD D 00 01 1001 19 ANTES: (H) = 21H (L) = 45H (D) = 15H (E) = 18H APÓS: (H) = 36H (L) = 5DH (D) = 15H (E) = 18H
40 - DAA
Decimal Adjust Accumulator
Ajuste Decimal do Acumulador Z, S, P, CY, AC
0010 0111 T = 4 F
O byte do acumulador se ajusta de modo a formar dois dígitos de 4 bits, codificados em BCD segundo o seguinte procedimento:
1- Se o valor dos 4 bits menos significativos são maior que 9 ou o flag AC está setado, o valor 06H é somado ao acumulador;
2- Se o valor dos 4 bits mais significativos do acumulador é maior que 9 ou se o flag CY está setado, soma-se 60H ao acumulador.
Exemplo:
Instrução Código (Binário) Código (Hexa)
DAA 0010 0111 27
ANTES: (A) = 12 AC = 1 CY = 0 APÓS: (A) = 18H (F) = 06H
Subtração
Todas as subtrações são realizadas via adição complemento de 2.
41 - SUB r
Subtract Register from Acc.
(A) = (A) - (r) Z, S, P, AC, CY
1001 0 FFF T = 4 F
É realizada uma subtração entre o conteúdo do Acumulador e o conteúdo do registrador r.
Exemplo:
Instrução Código (Binário) Código (Hexa)
SUB B 1001 0000 90
ANTES: (A) = 21H (B) = 31H APÓS: (A) = F0H (F) = 97H
42 - SUB M
SubtractMemory fromAcc.
(A) = (A) - ((H)(L)) Z, S, P, AC, CY 1001 0110 96H T= 7 F R
É realizada uma subtração entre o conteúdo do Acumulador e o conteúdo da memória endereçada pelo par HL.
Exemplo:
Instrução Código (Binário) Código (Hexa)
SUB M 1001 0110 96
ANTES: (H) = 20H (L) = 33H (A) = 21H (2033) = FFH
APÓS: (A) = 02H (F) = 03H
43 - SUI Data8
Subtract Immediate from Acc.
(A) = (A) - Data8 Z, S, P, AC, CY
1101 0110 Data8
T = 7 F R
44 - SBB r
Subtract Register with CY from Acc.
(A) = (A) - (r) - CY Z, S, P, AC, CY
1001 1 FFF T = 4 F
É realizada uma subtração entre o conteúdo do Acumulador e o conteúdo do registrador r e o flag CY.
Exemplo:
Instrução Código (Binário) Código (Hexa)
SBB B 1001 1000 98
ANTES: (A) = 21H (B) = 31H CY = 1 APÓS: (A) = FEH (F) = 83H
45 - SBB M
Subtract Memory with CY from Acc.
(A) = (A) - ((H)(L)) - CY Z, S, P, AC, CY 1001 1110 9EH T = 7 F R
É realizada uma subtração entre o conteúdo do Acumulador e o conteúdo da memória endereçada pelo par HL e o flag CY.
46 - SBI Data8
Subtract Immediate with CY from Acc.
(A) = (A) - Data8 - CY Z, S, P, AC, CY
1101 1110 Data8
T = 7 F R
É realizada uma subtração entre o conteúdo do Acumulador e o byte Data8 e o flag CY.
INCREMENTO
47 - INR r
Increment Register (r) = (r) + 1 Z, S, P, AC 00 DDD 100 T = 4 FÉ realizada um incremento no conteúdo do registrador r. Apenas o flag CY não é afetado.
Exemplo:
Instrução Código (Binário) Código (Hexa)
INR B 00 00 0100 04 ANTES: (B) = 31H CY = 0 APÓS: (B) = 32H (F) = 02H
48 - INR M
Increment Memory ((H)(L)) = ((H)(L)) +1 Z, S, P, AC 0011 0100 34H T = 10 F R WÉ realizado um incremento no conteúdo do endereço formado pelo par HL.
Exemplo:
Instrução Código (Binário) Código (Hexa)
INR M 0011 0100 34
ANTES: (H) = 20H (L) = 33H (2033) = F2H CY = 0
APÓS: (2033) = F3H (F) = 06H
49 - INX PR
IncrementExtendedRegister
(PR) = (PR) + 1 00 SR 0011 T = 6
S
É realizado um incremento no conteúdo do par de registradores PR. Nenhum flag é afetado.
Exemplo:
Instrução Código (Binário) Código (Hexa)
INX B 1100 0110 03
DECREMENTO
50 - DCR r
Decrement Register (r) = (r) - 1 Z, S, P, AC 00 DDD 101 T = 4 FÉ realizado um decremento no conteúdo do registrador r. Apenas o flag CY não é afetado.
51 - DCR M
Decrement Memory ((H)(L)) = ((H)(L)) -1 Z, S, P, AC 0011 0101 35H T = 10 F R WÉ realizado um decremento no conteúdo do endereço formado pelo par HL. Apenas o flag CY não é afetado.
52 - DCX PR
Decrement ExtendedRegister
(PR) = (PR) - 1 00 SR 1011 T = 6
S
É realizado um decremento no conteúdo do par de registradores PR. Nenhum flag é afetado.