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 ou registrador de LAGS. 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: As funções dos bits de LAGS são: LAGS CARRY (CY) Este flag é setado UM (1) quando o resultado de uma operação é um número maior do que 8 bits (ESTOURO ou OVERLOW). Caso contrário ele é zerado. H + 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. 0EH + 01H = 0H 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. 05H+0CH = 11H e AC=1. 12
ZERO (Z) Assume valor 1 quando o resultado de uma operação resultar em um valor ZERO (0) caso contrário ele é zerado. DH + 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 7H (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 (A) = (A) (r) 1010 0 T= 4 And Accumulator with Register Z, S, P, AC, CY É realizada uma operação AND entre o conteúdo do registrador r e o conteúdo do Acumulador e o resultado é transferido ao acumulador. ANA B 1010 0 000 A0 ANTES: (A) = 3CH (B) = 21H APÓS: (A) = 20H (B) = 21H ()=12H 15 - ANA M (A) = (A) ((H)(L)) 1010 0110 T = 7 And Accumulator with Register Z, S, P, AC, CY 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. ANA M 1010 0110 A6 ANTES: (H) = 20H (L) = 31H (2031H) = 7H (A) = 37H APÓS: (2031H) = 7H (A) = 37H () = 12H 16 - ANI Data8 (A) = (A) Data8 1110 0110 T = 7 And Immediate with Accumulator Z, S, P, AC, CY Data8 R É realizada uma operação AND entre o dado Data8 e o conteúdo do Acumulador e o resultado é transferido ao Acumulador. ANI 0 1110 0110 1111 0000 E6 0 ANTES: (A) = 37H APÓS: (A) = 30H ()=16H Operações OR (+ L ) Os flags CY e AC são desativados (=0). 17 - ORA r (A) = (A) + L (r) 1011 0 T = 4 Inclusive OR Register with Accumulator Z, S, P, AC, CY É realizada uma operação OR entre o conteúdo do registrador r e o conteúdo do Acumulador e o resultado é transferido ao acumulador. ORA B 1011 0 000 B0 ANTES: (A) = 3CH (B) = 21H APÓS: (A) = 3EH (B) = 21H ()=06H 13
18 - ORA M (A) = (A) + L ((H)(L)) 1011 0110 T = 7 Inclusive OR Memory with Accumulator Z, S, P, AC, CY B6H 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. ORA M 1011 0110 B6 ANTES: (H) = 20H (L) = 31H APÓS: (H) = 20H (L) = 31H (2031H) = 7H (A) = 37H (2031H) = 7H (A) = 7H ()=02H 19 - ORI Data8 Inclusive Or Immediate with Accumulator (A) = (A) + L Data8 Z, S, P, AC, CY 1111 0110 Data8 T = 7 R É realizada uma operação OR entre o dado Data8 e o conteúdo do Acumulador e o resultado é transferido ao Acumulador. ORI 1 1111 0110 1111 0001 6 1 ANTES : (A) = 37H APÓS: (A) = 7H () = 82H Operação OR Exclusivo ( ) - Os flags CY e AC são zerados. 20 - XRA r (A) = (A) (r) 1010 1 T = 4 Exclusive OR Register with Accumulator Z, S, P, AC, CY É 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. XRA B 1010 1 000 A8 ANTES: (A) = 3CH (B) = 21H APÓS: (A) = 1DH () = 06H 21 - XRA M (A) = (A) ((H)(L)) 1010 1110 T = 7 Exclusive OR Memory with Accumulator Z, S, P, AC, CY 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. XRA M 1010 1110 AE ANTES: (H) = 20H (L) = 31H (2031H) = 7H (A) = 37H APÓS: (2031H) = 7H (A) = 48H () = 06H 22 - XRI Data8 (A) = (A) Data8 1110 1110 T = 7 Exclusive Or Immediate with Accumulator Z, S, P, AC, CY Data8 R É realizada uma operação XOR entre o dado Data8 e o conteúdo do Acumulador e o resultado é transferido ao Acumulador. XRI 1 1110 1110 1111 0001 EE 1 ANTES: (A) = CH APÓS: (A) = 0DH () = 02H 14
Operações de Complemento 23 - CMA Complement Accumulator (A) = ( A ) 0010 1111 T = 4 Complementa o conteúdo do Acumulador e transfere o resultado ao Acumulador. Nenhum flag é afetado. CMA 0010 1111 2 ANTES: (A) = 3CH APÓS: (A) = 16H () = C3H 24 - CMC Complement Carry CY = CY 0011 1111 3H O flag CY é complementado. Nenhum outro flag é afetado. T= 4 25 - STC Set Carry O flag CY é setado CY = 1 0011 0111 37H T = 4 Operações de Comparação 26 - CMP r Compare Register with Accumulator (A) (r) Z, S, P, AC,CY 1011 1 T = 4 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). CMP B 1011 1000 B8 ANTES: (A) = 37H (B) = 21H APÓS: (A) = 37H () = 12H 27 - CMP M Compare Register with Memory (A) ((H)(L)) Z, S, P, AC,CY 1011 1110 BE H T = 7 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)). CMP M 1011 1110 BE 28 - CPI Data8 Compare Immediate ANTES: (H) = 20H (L) = 32H (2032H) = 5H (A) = 37H APÓS: (2032H) = 35H (A) =37H () = 17H (A) (Data8) Z, S, P, AC,CY 1111 1110 (E H) Data8 T = 7 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. CPI 45 1111 1110 0100 0101 E 45 ANTES: (A) = 20H APÓS: (A) = 20H () = 07H 15
Instruções de Rotação 29 - RLC Rotate Left Accumulator (A n+1 ) (A n ) (A 0 ) (A 7 ) (CY) (A 7 ) 0000 0111 07H T = 4 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. RLC 0000 0111 07 ANTES: (A) = 20H CY = X APÓS: (A) = 40H CY = 0 30 - RAL Rotate All Left Through Carry (A n+1 ) (A n ) (CY) (A 7 ) (A 0 ) (CY) 0001 0111 (17H) T= 4 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. RAL 0001 0111 17 ANTES: (A) = 20H CY = 1 APÓS: (A) = 41H CY = 0 31 - RRC Rotate Right Accumulator (A n ) (A n+1 ) (A 7 ) (A 0 ) (CY) (A 0 ) 0000 1111 (0H) T = 4 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 A 7, recebem o bit A 0, conforme o diagrama seguinte: Os demais flags não são afetados. RRC 0000 1111 0 ANTES: (A) = 20H CY = X APÓS: ( A) = 10H CY = 0 32 - RAR Rotate All Right Through Carry (A n ) (A n+1 ) (CY) (A 0 ) 0001 1111 (1H) T = 4 16
(A 7 ) (CY) 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. RAR 0001 1111 1 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 (A) = (A) + (r) 1000 0 T = 4 Add Acc. with Register Z, S, P, AC, CY É realizada uma soma entre o conteúdo do Acumulador e o conteúdo do registrador r. ADD B 1000 0000 80 ANTES: (A) = 21H (B) = 31H APÓS: (A) = 52H () = 02H 34 - ADD M Add Acc. with Memory (A) = (A) + ((H)(L)) Z, S, P, AC, CY 1000 0110 T = 7 R 17
É realizada uma soma entre o conteúdo do Acumulador e o conteúdo da memória endereçada pelo par HL. ADD M 1000 0110 86 ANTES: (H) = 20H (L) = 33H APÓS: (A) = 20H () = 13H (A) = 21H (2033) = H 35 - ADI Data8 (A) = (A) + Data8 1100 0110 Add with Immediate Z, S, P, AC, CY Data8 É realizada uma soma entre o conteúdo do Acumulador e o byte Data8. T = 7 R ADI 45 1100 0110 0010 0101 C6 45 ANTES: (A) = 21H (2033) = 45H APÓS: (A) = 66 H () = 06H 36 - ADC r (A) = (A) + (r) + CY 1000 1 T = 4 Add Acc. with Register and Carry Z, S, P, AC, CY É realizada uma soma entre o conteúdo do Acumulador e o conteúdo do registrador r e o flag CY. ADC B 1000 1000 88 ANTES: (A) = 21H (B) = 31H (CY)=1 APÓS: (A) = 53H () = 06H 37 - ADC M (A) = (A) + ((H)(L)) + CY 1000 1110 T = 7 Add Acc. with Memory and Carry Z, S, P, AC, CY 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. ADC M 1000 1110 8E ANTES: (H) = 20H (L) = 33H APÓS: (A) = 21H () = 06H (A) = 21H (2033) = H CY=1 38 - ACI Data8 A = (A) + Data8 + CY 1100 1110 T = 7 Add Acc. with Immediate and Carry Z, S, P, AC, CY Data8 R É realizada uma soma entre o conteúdo do Acumulador com o byte Data8 e o flag CY. ACI 45 1100 1110 0010 0101 CE 45 ANTES: (A) = 21H (2033) = 45H CY=1 APÓS: (A) = 67H () = 02H 39 - DAD PR Double Register Add (H)(L) = (H)(L) + (PR) CY 00 PR 1001 T = 10 B B 18
É realizada uma soma de 16 bits entre o conteúdo do par de registradores HL e o par PR e o 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. DAD D 00 01 1001 19 ANTES: 40 - DAA Decimal Adjust Accumulator (H) = 21H (L) = 45H (D) = 15H (E) = 18H APÓS: Ajuste Decimal do Acumulador Z, S, P, CY, AC (H) = 36H (L) = 5DH (D) = 15H (E) = 18H 0010 0111 T = 4 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. DAA 0010 0111 27 ANTES: (A) = 12 AC = 1 CY = 0 APÓS: (A) = 18H () = 06H Subtração Todas as subtrações são realizadas via adição complemento de 2. 41 - SUB r (A) = (A) - (r) 1001 0 T = 4 Subtract Register from Acc. Z, S, P, AC, CY É realizada uma subtração entre o conteúdo do Acumulador e o conteúdo do registrador r. SUB B 1001 0000 90 ANTES: (A) = 21H (B) = 31H APÓS: (A) = 0H () = 97H 42 - SUB M (A) = (A) - ((H)(L)) 1001 0110 T= 7 Subtract Memory from Acc. Z, S, P, AC, CY 96H R É realizada uma subtração entre o conteúdo do Acumulador e o conteúdo da memória endereçada pelo par HL. SUB M 1001 0110 96 ANTES: (H) = 20H (L) = 33H APÓS: (A) = 02H () = 03H (A) = 21H (2033) = H 43 - SUI Data8 (A) = (A) - Data8 1101 0110 Subtract Immediate from Acc. Z, S, P, AC, CY Data8 É realizada uma subtração entre o conteúdo do Acumulador e o byte Data8. T = 7 R 19
44 - SBB r (A) = (A) - (r) - CY 1001 1 T = 4 Subtract Register with CY from Acc. Z, S, P, AC, CY É realizada uma subtração entre o conteúdo do Acumulador e o conteúdo do registrador r e o flag CY. SBB B 1001 1000 98 ANTES: (A) = 21H (B) = 31H CY = 1 APÓS: (A) = EH () = 83H 45 - SBB M (A) = (A) - ((H)(L)) - CY 1001 1110 T = 7 Subtract Memory with CY from Acc. Z, S, P, AC, CY 9EH 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 (A) = (A) - Data8 - CY 1101 1110 T = 7 Subtract Immediate with CY from Acc. Z, S, P, AC, CY Data8 R É realizada uma subtração entre o conteúdo do Acumulador e o byte Data8 e o flag CY. INCREMENTO 47 - INR r (r) = (r) + 1 00 DDD 100 T = 4 Increment Register Z, S, P, AC É realizada um incremento no conteúdo do registrador r. Apenas o flag CY não é afetado. INR B 00 00 0100 04 ANTES: (B) = 31H CY = 0 APÓS: (B) = 32H () = 02H 48 - INR M ((H)(L)) = ((H)(L)) +1 0011 0100 Increment Memory Z, S, P, AC 34H É realizado um incremento no conteúdo do endereço formado pelo par HL. T = 10 R W INR M 0011 0100 34 ANTES: (H) = 20H (L) = 33H APÓS: (2033) = 3H () = 06H (2033) = 2H CY = 0 49 - INX PR Increment Extended Register (PR) = (PR) + 1 00 SR 0011 T = 6 S É realizado um incremento no conteúdo do par de registradores PR. Nenhum flag é afetado. INX B 1100 0110 03 ANTES: (B) = 21H (C) = H APÓS: (B) = 22H (C) = 00H 20
DECREMENTO 50 - DCR r (r) = (r) - 1 00 DDD 101 T = 4 Decrement Register Z, S, P, AC É realizado um decremento no conteúdo do registrador r. Apenas o flag CY não é afetado. 51 - DCR M ((H)(L)) = ((H)(L)) -1 0011 0101 T = 10 Decrement Memory Z, S, P, AC 35H 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 Extended Register (PR) = (PR) - 1 00 SR 1011 T = 6 S É realizado um decremento no conteúdo do par de registradores PR. Nenhum flag é afetado. 21