ADD A,sEssa instrução realiza uma soma entre o registrador A com qualquer registrador, um valor direto ou um conteúdo de memória apontado pelo registrador HL, IX ou IY.
Mnemônico | SZHPNC | Tipo | Descrição | Notas ----------+--------+-------------+----------------+--------- ADD A,s | ***V0* | Aritmética | Add | A=A+sAo observarmos a coluna "Notas", relativa a essa instrução, há uma expressão que indica o que acontece quando ela é executada:
A = A + sO registrador A (acumulador), recebe a soma entre o próprio registrador A e uma expressão s, que significa:
s - Qualquer registrador r, valor n, [HL] ou [xx+d] xx - Registrador de índice: IX ou IYOnde:
ADD A,B ADD A,15 ADD A,(HL) ADD A,(IX+4)A coluna "SZHPNC" indica quais são os flags afetados pela instrução. Símbolos:
Mnemônico | SZHPNC | Tipo | Descrição | Notas -----------+--------+---------------+----------------+--------- LD dst,src | ------ | Transferência | Load | dst=srcOnde:
src - Fonte: s, ss, [BC], [DE], [HL], nn, [nn] dst - Destino: s, ss, [BC], [DE], [HL], [nn] s - Qualquer registrador r, valor n, [HL] ou [xx+d] ss - Par de registradores: BC, DE, HL ou SP nn - Expressão de dois bytes (0 a 65535)
LD A,4 ADD A,2
Exemplos:
LD A,B
Faz A=B.
A é alterado e B continua com o mesmo valor.
Vejamos o estado dos registradores antes e depois da instrução:
A B C D E H L SZ H PNC
Antes: 00 01 02 00 00 00 00 00 0 000
Depois: 01 01 02 00 00 00 00 00 0 000
A B C D E H L SZ H PNC
Antes: 0F 01 CA 00 00 00 00 00 0 000
Depois: 0F 0F CA 00 00 00 00 00 0 000
Registradores End. Memória
A B C D E H L SZ H PNC 0FFF 1000 1001
Antes: 0F 01 CA 00 00 00 00 00 0 000 45 CD 00
Depois: 0F 01 CA 00 00 00 00 00 0 000 45 0F 00
Registradores End. Memória
A B C D E H L SZ H PNC 0FFF 1000 1001
Antes: 0F 01 CA 00 00 BB DD 00 0 000 45 CD 00
Depois: 0F 01 CA 00 00 BB DD 00 0 000 45 DD BB
Nota: Observe que o número de 16 bits é invertido na memória. Assim, concluímos que:
(end) ← L (end+1) ← H
Registradores End. Memória
A B C D E H L SZ H PNC 0FFF 1000 1001
Antes: 0F 01 CA 00 00 BB DD 00 0 000 45 CD 00
Depois: 0F 01 CA 00 00 00 CD 00 0 000 45 CD 00
Igualmente:
L ← (end) H ← (end+1)
Registradores End. Memória
A B C D E H L SZ H PNC 0FFF 1000 1001
Antes: 0F 01 CA 00 00 BB DD 00 0 000 45 CD 00
Depois: 0F 01 CA 00 00 12 34 00 0 000 45 CD 00
Nota: Diferentemente da transferência de registrador de 16 bits para a memória, onde há inversão, a transferência de um valor imediato de 16 bits para o registrador NÃO causa inversão.
LDD (decrementa): (DE)=(HL) HL=HL-1 DE=DE-1 BC=BC-1 LDI (incrementa): (DE)=(HL) HL=HL+1 DE=DE+1 BC=BC-1LDD vai no sentido negativo da memória, enquanto que LDI vai no sentido positivo da memória. Ambas instruções decrementam o registador BC.
LD BC,0 LD DE,&H1000 LD HL,&H2000 LDDVejamos o estado dos registradores e memória antes e depois da instrução "LDD":
Registradores End. Memória
A B C D E H L SZ H PNC 1000 2000
Antes: 00 00 00 10 00 20 00 00 0 000 45 CD
Depois: 00 FF FF 0F FF 1F FF 00 0 000 CD CD
LDDR (decrementa em loop):
Faz LDD até que BC=0
LDDI (incrementa em loop):
Faz LDI até que BC=0
LDDR vai no sentido negativo da memória, enquanto que LDIR vai no sentido positivo da memória.LD BC,10 LD DE,&H1000 LD HL,&H2000 LDDRTransfere o conteúdo de memória de 2000H-1FF7H para 1000H-0FF7H. Se fosse LDDI, seria de 2000H-2009H para 1000H-1009H.
A B C D E H L SZ H PNC
Antes: 0F 01 CA 12 34 AB CD 00 0 000
Depois: 0F 01 CA AB CD 12 34 00 0 000
A B C D E H L SZ H PNC
Antes: A4 00 00 00 00 00 00 00 0 000
15 00 00 00 00 00 00 00 0 000
Depois: 15 00 00 00 00 00 00 00 0 000
A4 00 00 00 00 00 00 00 0 000
A B C D E H L SZ H PNC
Antes: 00 11 11 22 22 33 33 00 0 000
00 AA AA BB BB CC CC 00 0 000
Depois: 00 AA AA BB BB CC CC 00 0 000
00 11 11 22 22 33 33 00 0 000
EX AF,AF'
EX AF,AF'
Passo 1 (EX AF,AF'):
A
Antes: A4
15
Depois: 15
A4
Passo 2 (EX AF,AF'):
A
Antes: 15
A4
Depois: A4
15
Entretanto, se houver mudança do registrador entre as trocas, temos:
EX AF,AF'
LD A,&H67
EX AF,AF'
Passo 1 (EX AF,AF'):
A
Antes: A4
15
Depois: 15
A4
Passo 2 (LD A,&H67):
A
Antes: 15
A4
Depois: 67
A4
Passo 3 (EX AF,AF'):
A
Antes: 67
A4
Depois: A4
67
10 PRINT"Imprimo essa linha" 20 GOTO 40 30 PRINT"Mas não imprimo essa" 40 PRINT"Eu saltei para cá"
LD A,1 JP NZ,&HC100Pode não funcionar corretamente, pois os flags não foram afetados pela instrução LD A,1.
LD A,&HFF INC A JP Z,&HC100Agora irá funcionar corretamente, pois os flags foram afetados pela instrução INC A.
CALL nn ; Chama endereço de memória nn CALL cc,nn ; Chama endereço nn, dada uma condição cc
(SP) ← PC (da próxima instrução) SP ← SP-2 PC ← nn
PC SP Pilha:
Antes: C000 FD50 0000
0000
Depois: 004D FD4E C003
0000
SZ H PNC PC
Antes: 00 0 000 C000
Depois 00 0 000 C100
RET ; Retorna RET cc ; Retorna, dada uma condição RETI ; Retorna de uma interrupção RETN ; Retorna de uma interrupção não-mascarada
PC ← (SP) SP ← SP+2
JP nn ; PC = endereço JR e ; PC = PC + 2 + offset
C000 C3 00 C1 JP &HC100 x--+ C003 C9 RET | ... | C100 <------------------------+
C000 18 00 JR 0 C002 C9 RET x
C000 18 10 JR 0 C002 C9 RET x--+ ... | C012 <-------------------------+
BFF2 <-------------------------+ ... | C000 18 F0 JR 0 | C002 C9 RET x--+
10 ORG &HC000 20 LD A,0 30 LOOP: ADD A,B 40 JR LOOP
C000 3E 00 LD A,0 C002 80 LOOP: ADD A,B C003 18O valor FDH é igual a -3. Visto que a posição de referência para o offset é C005H, ao subtrairmos 3 de C005H chegamos a C002H.FD JR LOOP
10 ORG &HC000 20 LD A,4 30 LACO: DEC A ; A=A-1 40 JR NZ,LACO 50 RET
JP (HL) ; PC ← HL JP (IX) ; PC ← IX JP (IY) ; PC ← IY
DJNZ eOnde "e" é um endereço de 8 bits sinalizado (como na instrução JR).
B=B-1 Se B<>0 então PC ← e
Endereço Assembly Linha Mnemônico C000 10 ORG &HC000 C000 060A 20 LD B,10 ; Número de repetições C002 AF 30 XOR A ; Faz A=0 C003 3C 40 LOOP: INC A ; Faz A=A+1 C004 10FD 50 DJNZ LOOP ; Se B<>0 então vá para LOOP C006 C9 60 RET ; Retorna
SI &HC000 Modo (H/D): H
Primeiro, faz B=B-1. Logo B=0. Testa se B=0. Como é 0, termina.Assim:
10 ORG &HC000 20 LD B,1 30 LOOP: DJNZ LOOPA execução do programa irá passar apenas uma vez pela linha 30.
10 LD B,0 20 LOOP: DJNZ LOOP ; Repete 256x
Realizam operações aritméticas básicas como soma, subtração, incremento e decremento.
Instruções: ADD, ADC, SUB, SBC, INC, DEC e DAA.
Obs: no caso de multiplicação e divisão, deve-se aplicar as propriedades matemáticas de soma e subtração para realizá-las. Veja a seção de exercícios.
3.1 - ADD e SUB
Realiza uma soma ou subtração entre registradores, ou entre um registrador e um valor direto ou apontado por um endereço de memória.
Operações possíveis para a soma:
ADD A,s ; A=A+s ADD HL,ss ; HL=HL+ss ADD IX,pp ; IX=IX+pp ADD IY,rr ; IY=IY+rrOnde:
s - Qualquer registrador r, valor n, [HL] ou [xx+d] ss - Par de registradores: BC, DE, HL ou SP pp - Par de registradores: BC, DE, IX ou SP rr - Par de registradores: BC, DE, IY ou SP
A B C D E H L SZ H PNC
Antes: 10 00 00 00 00 00 00 00 0 000
Depois: 12 00 00 00 00 00 00 00 0 000
A B C D E H L SZ H PNC
Antes: 05 04 00 00 00 00 00 00 0 000
Depois: 09 00 00 00 00 00 00 00 0 000
Memória
A B C D E H L 1000
Antes: 05 00 00 00 00 10 00 10
Depois: 15 00 00 00 10 00 00 10
A B C D E H L SZ H PNC
Antes: 00 02 34 00 00 10 00 00 0 000
Depois: 09 00 00 00 00 12 34 00 0 000
IX IY SP
Antes: 0000 1000 E000
Depois: 0000 F000 E000
ADD A,HL ; ERRO!!
SUB s ; A=A-s
A B C D E H L SZ H PNC
Antes: 18 00 00 00 00 00 00 00 0 000
Depois: 10 00 00 00 00 00 00 00 0 000
A B C D E H L SZ H PNC
Antes: 05 00 00 03 00 00 00 00 0 000
Depois: 02 00 00 00 00 00 00 00 0 000
Hexa Binário 03 00000011 Complemento (inverter bits): Hexa Binário FC 11111100 Complemento a dois: Hexa Binário FC 11111100 +01 00000001 --------------- FD 11111101
LD A,5 LD B,3 SUB BEquivale a:
LD A,5 LD B,&HFD ADD A,B
ADC A,s ; A=A+s+CY ADC HL,ss ; HL=HL+ss+CY SBC A,s ; A=A-s-CY SBC HL,ss ; HL=HL-ss-CYOnde CY é o valor do flag de carry.
ADC A,B
Soma os registradores A e B, levando em conta o flag de "carry".
A B C D E H L SZ H PNC
Antes: 02 01 00 00 00 BB DD 00 0 001
Depois: 04 01 00 00 00 BB DD 00 0 000
Ele fez: A=A+B+CY. Como o flag de carry é igual a 1, em vez de dar 3, o resultado, deu 4.
A B C D E H L SZ H PNC
Antes: 04 00 00 00 02 BB DD 00 0 001
Depois: 01 02 00 00 00 BB DD 00 0 000
Ele fez: A=A-E-CY. Como o flag de carry é igual a 1, em vez de dar 2, o resultado, deu 1.
A B C D E H L SZ H PNC
Antes: 04 00 00 05 10 15 10 00 0 000
Depois: 04 00 00 05 10 10 00 00 0 000
INC r ; r=r+1 INC (HL) ; (HL)=(HL)+1 INC xx ; XI=XI+1 ou YI=YI+1 INC (xx+d) ; (XI+d)=(XI+d)+1 ou (YI+d)=(YI+d)+1 INC ss ; ss=ss+1
A B C D E H L SZ H PNC
Antes: 00 00 00 00 00 A0 00 00 0 000
Depois: 00 00 00 00 00 A1 00 00 0 000
Memória
A B C D E H L SZ H PNC 1000H
Antes: 00 00 00 00 00 10 00 00 0 000 04
Depois: 00 00 00 00 00 10 00 00 0 000 05
DEC s ; s=s-1 DEC xx ; XI=XI-1 ou YI=YI-1 DEC ss ; ss=ss-1
A B C D E H L SZ H PNC
Antes: 00 00 00 00 00 10 00 00 0 000
Depois: 00 00 00 00 00 0F FF 00 0 000
Decimal Binário Decimal Binário
0 0000 5 0101
1 0001 6 0110
2 0010 7 0111
3 0011 8 1000
4 0100 9 1001
08H + 04H ----- 0CHSe considerarmos 08H e 04H como dois números BCD, o resultado da conta está errado. Assim, o ajuste DAA corrige o valor de 0CH para 12H.
A=B1H | A=0FH DAA -> B+6+CY 1+0 = 1 1 | DAA -> 0+0+CY F+6 = 1 5 A=11H | A=15H
10 ORG &HC000 20 LD A,8 30 ADD A,4 40 DAA
PUSH xx ; (SP) ← xx / SP=SP-2 PUSH qq ; (SP) ← qq / SP=SP-2 POP xx ; xx ← (SP) / SP=SP+2 POP qq ; qq ← (SP) / SP=SP+2Onde:
qq - Par de registradores: AF, BC, DE ou HL xx - Registrador de índice: IX ou IY
Registradores End. Memória
A B C D E H L SZ H PNC SP 0FFF 1000 1001
Antes: 0F 01 CA 00 00 00 00 00 0 000 1000 45 CD 00
Depois: 0F 01 CA 00 00 00 00 00 0 000 0FFE CA 01 00
Registradores End. Memória
A B C D E H L SZ H PNC SP 0FFF 1000 1001
Antes: 0F 01 CA 00 00 BB DD 00 0 000 0FFE 45 CD 00
Depois: CD 01 CA 00 00 00 CD 01 0 101 1000 45 CD 00
Obs: o valor passado para o registrador F foi 45H, que tem sua representação binária igual a 01000101. Essa configuração de bits é passada para os flags, conforme visto no exemplo acima.EI ; Habilita interrupções DI ; Desabilita interrupções IM n ; Modo de interrupção (0,1,2)
DI ; Desabilita interrupções
LD B,&H100 ; ****************************
XOR A ; * Esse trecho não pode ser *
P1: ADD A,5 ; * interrompido *
DJZN ; ****************************
EI ; Habilita interrupções
IN A,(n) ; A recebe dado da porta "n" IN r,(C) ; r recebe dado da porta indicada por C IND ; (HL) ← (C), HL=HL-1, B=B-1 INDR ; IND até B=0 INI ; (HL) ← (C), HL=HL+1, B=B-1 INIR ; INI até B=0
Registradores End. Memória
A B C D E H L SZ H PNC 0FFF 1000 1001
Antes: 00 10 20 00 00 10 00 00 0 000 FF FF FF
Depois: 00 0F 20 00 00 10 01 00 0 000 FF 25 FF
Obs: supor que a porta 20 enviou o dado 25H.LD B,100 LD HL,&H1000 LD C,10 INIRTransfere 100 bytes da porta 10 para a memória, a partir da posição 1000H e para frente.
OUT (n),A ; A envia dado à porta "n" OUT (C),r ; r envia dado à porta indicada por C OUTD ; (C) ← (HL), HL=HL-1, B=B-1 OTDR ; OUTD até B=0 OUTI ; (C) ← (HL), HL=HL+1, B=B-1 OTIR ; OUTI até B=0
Registradores End. Memória
A B C D E H L SZ H PNC 1000 1001 1002
Antes: 00 03 10 00 00 10 00 00 0 000 21 22 23
Depois: 00 02 10 00 00 10 01 00 0 000 21 22 23
Depois: 00 01 10 00 00 10 02 00 0 000 21 22 23
Depois: 00 00 10 00 00 10 03 00 0 000 21 22 23
Ordem dos dados enviados para a porta 10H:AND s ; A ← A AND s OR s ; A ← A OR s XOR s ; A ← A XOR s CP s ; A-s, setando os flags CPL ; A ← NOT A NEG ; A ← -AOnde:
s - Qualquer registrador r, valor n, [HL] ou [xx+d]
A=14H, B=ACH
00010100
AND 10101100
--------------
00000100
Situação dos registradores:
A B C D E H L SZ H PNC
Antes: 10 AC 00 00 00 00 00 00 0 000
Depois: 04 AC 00 00 00 00 00 00 1 000
A=7FH, valor=40H
01111111
AND 01000000
------------
01000000
Situação dos registradores:
A B C D E H L SZ H PNC
Antes: 7F 00 00 00 00 00 00 00 0 000
Depois: 40 00 00 00 00 00 00 00 1 000
A=14H, C=ACH
00010100
OR 10101100
-----------
10111100
Situação dos registradores:
A B C D E H L SZ H PNC
Antes: 10 00 AC 00 00 00 00 00 0 000
Depois: BC 00 00 00 00 00 00 1 0 0 000
A=6FH, D=50H
01101111
XOR 01010000
------------
00111111
Situação dos registradores:
A B C D E H L SZ H PNC
Antes: 6F 00 00 50 00 00 00 00 0 000
Depois: 3F 00 00 00 00 00 00 00 0 1 00
10101010
XOR 10101010
------------
00000000
Como a instrução XOR em Assembly é mais rápida que a instrução LD, muitos programadores utilizam esse recurso para zerar o registrador A, através da instrução "XOR A".
A B C D E H L SZ H PNC
Antes: 09 00 00 00 00 00 00 00 0 000
Depois: 09 00 00 00 00 00 00 1 0 1 011
Obs: o resultado da conta dá FFH, que é igual a -1.IF A >= B THEN rot1 ELSE rot2Em Assembly:
CP B JP NC rot1 ; Se A>=B rot1 rot2 ; Else rot2
IF A < B THEN rot1 ELSE rot2Em Assembly:
CP B JP C rot1 ; Se A<B rot1 rot2 ; Else rot2Em ambos os casos, o flag de "carry" foi utilizado para verificar se houve estouro na conta. Quando "A-s" dá negativo, C=1.
IF A = B THEN rot1 ELSE rot2Em Assembly:
CP B JP Z rot1 ; Se A=B rot1 rot2 ; Else rot2
IF A <> B THEN rot1 ELSE rot2Em Assembly:
CP B JP NZ rot1 ; Se A<>B rot1 rot2 ; Else rot2
CPD ; A-(HL) / HL=HL-1 / BC=BC-1 CPDR ; CPD até A=(HL) ou BC=0 CPI ; A-(HL) / HL=HL+1 / BC=BC-1 CPIR ; CPI até A=(HL) ou BC=0
LD HL,&HD000 ; A partir de D000H LD BC,10 ; Em 10 posições para frente LD A,4 ; Busca o valor 04H CPIRCaso não exista qualquer valor 04H na memória de D000H a D009, teremos:
A B C D E H L SZ H PNC
Antes: 04 00 0A 00 00 D0 00 00 0 000
Depois: 04 00 00 00 00 D0 0A 1 0 1 01 0
Como o flag de "carry" é 0, a busca não encontrou o valor 4.
A B C D E H L SZ H PNC
Antes: 04 00 0A 00 00 D0 00 00 0 000
Depois: 04 00 06 00 00 D0 04 01 0 11 0
Como o flag de "carry" é 1, a busca encontrou o valor 4. O endereço de memória do valor encontrado é igual a "HL-1".BIT b,m ; Testa o bit "b" de m. Retorna em Z. CCF ; Complemento do "carry": CY= NOT CY SCF ; Seta o flag de carry: CY=1 RES b,m ; Resseta o bit "b" de m. SET b,m ; Seta o bit "b" de m.Onde:
m - Qualquer registrador r, [HL] ou [xx+d]
Bit | 76Registradores:5 43210 ----+--------- C | 001 10111
A B C D E H L SZ H PNC
Antes: 00 00 37 00 00 00 00 00 0 000
Depois: 00 00 37 00 00 00 00 00 1 000
Se for "BIT 6,C", Z=1.A=00H +-----+-+-+-+-+-+-+-+-+ | bit |7|6|5|4|3|2|1|0| +-----+-+-+-+-+-+-+-+-+ | |0|0|0|0|0|0|0|0| Antes +-----+-+-+-+-+-+-+-+-+ | |0|0|0|1 |0|0|0|0| Depois +-----+-+-+-+-+-+-+-+-+
C=FFH +-----+-+-+-+-+-+-+-+-+ | bit |7|6|5|4|3|2|1|0| +-----+-+-+-+-+-+-+-+-+ | |1|1|1|1|1|1|1|1| Antes +-----+-+-+-+-+-+-+-+-+ | |1|1|1|1|1|0 |1|1| Depois +-----+-+-+-+-+-+-+-+-+
Onde o bit 7 sobra e "?" é preenchido de acordo com algum critério.76543210 <------- 76543210?
Onde o bit 0 sobra e "?" é preenchido de acordo com algum critério.76543210 ------->?7654321 0
| Instrução | Descrição | Ilustração |
|---|---|---|
| RLCA | Rotação do registrador A para a esquerda. Bit 7 vai para CY e bit 0. |
![]() |
| RR m | Rotação para a direita com "carry", através do "vai um". CY vai para o bit 7 e o o bit 0 vai para CY. |
![]() |
| SLA m | Deslocamento para a esquerda. O bit 7 vai para CY e o bit 0 é preenchido com 0. |
![]() |
| SRA m | Deslocamento para a direita, preservando o bit 7. O bit 0 vai para CY. |
![]() |
| SRL m | Deslocamento para a direita. O bit 0 vai para CY e o bit 7 é preenchido com 0. |
![]() |
| RLD | Deslocamento para a esquerda em 4 bits. Faz combinação de nibbles de A e (HL). |
![]() |
| RRD | Deslocamento para a direita em 4 bits. Faz combinação de nibbles de A e (HL). |
![]() |
| RLA | Rotação para a esquerda com "carry" no registrador A, através do "vai um". CY vai para o bit 0 e o o bit 7 vai para CY. |
![]() |
| RRCA | Rotação do registrador A para a direita. Bit 0 vai para CY e bit 7. |
![]() |
| RRA | Rotação para a direita com "carry" no registrador A, através do "vai um". CY vai para o bit 7 e o o bit 0 vai para CY. |
![]() |
| RLC m | Rotação para a esquerda. Bit 7 vai para CY e bit 0. |
![]() |
| RL m | Rotação para a esquerda com "carry", através do "vai um". CY vai para o bit 0 e o o bit 7 vai para CY. |
![]() |
| RRC m | Rotação para a direita. Bit 0 vai para CY e bit 7. |
![]() |
Antes: A=1 0001000 e CY=0 Depois: A=0001000 1 e CY=1
Antes: A=1000100 0 e CY=0 Depois: A=0 1000100 e CY=0
Antes: A=10000010 e HL=1010 0101 Depois: A=10001010 e HL=0101 0010
| << Anterior | Assembly | Próxima >> |