3. Sobre o material
• Essas transparências foram baseadas
em materiais elaborados pelos
professores Hugo Vieira Neto,
Eduardo Bertonha e Gabriel
Kovalhuk
4. Assembly
• Opcode (Operation code)
– Instrução em linguagem de máquina
– Carga, aritmética, lógica, controle, etc
– Operandos: registradores, pilha,
memória, interfaces E/S, etc
• Assembly
– Linguagem de baixo nível
– Mnemônicos
5. Assembly
• Mnemônicos
– Representam opcode
– Mais compreensível para humanos
– Significado exato para máquina
• Assembler (Montador)
– mnemônicos → opcodes
• Labels (Referências)
– Nomes dados endereços, variáveis,
etc
7. Assembly
CLR C ;faz carry=0
SUBB A, R0 ;subtrai R0 de A
JZ IGUAL ;se R0=A salta para IGUAL
JC MAIOR ;se R0>A salta para MAIOR
MENOR: MOV R1, #01 ;sinaliza em R1 que R0<A
SJMP FIM
MAIOR: MOV R1, #02 ;sinaliza em R1 que R0>A
SJMP FIM
IGUAL: MOV R1, #00 ;sinaliza em R1 que R0=A
FIM: ;segue em frente
Comentários
Labels
8. Assembly
• Códigos das instruções de 8 bits
• Extensão variável de 1 a 3 bytes
• Tempo de execução variável de 1 a
4 ciclos de máquina
• Mnemônicos seguem o padrão Intel
9. Conjunto de Instruções
• Transferência de dados
– MOV, MOVX, MOVC
– PUSH, POP
– XCH, XCHD
• Aritméticas
– ADD, ADDC, SUBB
– INC, DEC
– MUL, DIV
– DA
11. Conjunto de Instruções
• Desvio
– ACALL, LCALL, RET, RETI
– AJMP, LJMP, SJMP, JMP
– JZ, JNZ, JC, JNC, JB, JNB, JBC
– CJNE, DJNZ
– NOP
12. Modos de Endereçamento
• Endereçamento Direto
– MOV A, 25h
– Move para A o conteúdo de da
posição de memória 25h
• Endereçamento por Constante
Imediata
– MOV A, #25h
– Move para A o dado imediato 25h (#)
13. Modos de Endereçamento
• Endereçamento Indireto
– MOV A, @R1
– Move para A o conteúdo da posição de
memória apontada por R1 (@)
• Endereçamento via Registrador
– MOV A, R1
– Move para A o conteúdo de R1
14. Modos de Endereçamento
• Endereçamento Indexado
– MOVX A, @DPTR
– Move para A o conteúdo da posição de
memória apontada por DPTR
– MOVC A, @A+DPTR
– Move para A o conteúdo da posição de
memória apontada por A+DPTR
– MOVC A, @A+PC
– Move para A o conteúdo da posição de
memória apontada por A+PC
15. Notação dos Mnemônicos
• Endereçamento de dados
– A - acumulador
– B - registro especial B
– Rn - R0 a R7 do banco em uso
– direto - endereço da RAM interna
– @Ri - R0 ou R1 como ponteiro da
RAM interna
– @DPTR - DPTR como ponteiro da
ROM ou RAM externa
16. Notação dos Mnemônicos
• Endereçamento de dados (cont.)
– #dado - constante de 8 bits
– #dado16 - constante de 16 bits
– Bit - flag, bit de controle ou de port de E/S
• Endereçamento de programa
– end11 - endereço dentro de página de 2KB
– end16 - endereço dentro do espaço de
64KB
– rel - destino relativo à próxima instrução
(128 a +127)
17. Diretivas do Assembler
• ORG exp
• END exp
• label: DB exp
• label: DW exp
• label: LONG exp
• label: ASCII exp
• label: EQU val
18. Programa em Assembly
TESTE EQU 01010101B ;CONSTANTE DE TESTE
ORG 0000H ;ENDERECO DE RESET
RESET: LJMP INICIO ;SALTA PARA O INICIO
ORG 0100H ;INICIO DO PROGRAMA
INICIO: MOV A, #040H ;INICIALIZA CONTADOR
MOV R0, #64 ;ENDERECO INICIAL
REPETE: MOV @R0, #TESTE ;ESCREVE CONSTANTE
INC R0 ;PRÓXIMO ENDEREÇO
DEC A ;DECREMENTA CONTADOR
CJNE A, #0, REPETE ;SE NAO TERMINOU REPETE
FINAL: JMP FINAL
19. Resultado do Montador
LOC OBJ LINE SOURCE
0055 1 TESTE EQU 01010101B
2
0000 3 ORG 0000H
0000 020100 4 RESET: LJMP INICIO
5
0100 6 ORG 0100H
0100 7440 7 INICIO: MOV A, #040H
0102 7840 8 MOV R0, #64
0104 7655 9 REPETE: MOV @ R0 , # 85
0106 08 10 INC R0
0107 14 11 DEC A
0108 B400F9 12 CJNE A, #0, REPETE
010B 80FE 13 FINAL: JMP FINAL
20. Pilha
• Pilha
– Estrutura de dados do tipo LIFO, cujo topo é
apontado pelo registro SP
– Utilizada para armazenamento temporário
de dados e endereços de retorno de
subrotinas e interrupções
– O programa em Assembly deve manter o
equilíbrio da pilha, evitando o estouro da sua
capacidade
21. Exemplo - Pilha
PUSH ACC ;salva acumulador na pilha
PUSH PSW ;salva PSW na pilha
PUSH DPL ;salva DPTR na pilha
PUSH DPH
...
;sequencia de instrucoes
...
POP DPH ;recupera DPTR da pilha
POP DPL
POP PSW ;recupera PSW da pilha
POP ACC ;recupera acumulador da pilha
22. Estruturas de
Programação
• Subrotinas
– São funções (rotinas) chamadas por
software
– Úteis quando uma seqüência de
operações em um programa é
repetidamente utilizada
23. Exemplo - Subrotina
INICIO: MOV R0, #11H ;valor=11H
LCALL ENVIA ;chama subrotina ENVIA
MOV R0, #22H ;valor=22H
LCALL ENVIA ;chama subrotina ENVIA
SJMP INICIO ;retorna ao INICIO
ENVIA: ANL R0, #0FH ;zera nibble superior
ORL R0, #30H ;forma codigo ASCII
MOV SBUF, R0 ;envia pela serial
RET ;retorna da subrotina
25. Exemplo - Interrupção
TIMER0: PUSH ACC ;salva acumulador
PUSH PSW ;salva PSW
MOV PSW, #00011000B ;banco 3
MOV A, P1 ;le port P1
ANL A, #11000000B ;mascara
MOV ESTADO, A ;guarda em ESTADO
POP PSW ;recupera PSW
POP ACC ;recupera A
RETI ;retorno da int
27. Exemplo - Estrutura de Decisão
CLR C ;faz carry=0
SUBB A, R0 ;subtrai R0 de A
JZ IGUAL ;se R0=A salta para IGUAL
JC MAIOR ;se R0>A salta para MAIOR
MENOR: MOV R1, #01 ;sinaliza em R1 que R0<A
SJMP FIM
MAIOR: MOV R1, #02 ;sinaliza em R1 que R0>A
SJMP FIM
IGUAL: MOV R1, #00 ;sinaliza em R1 que R0=A
FIM: ;segue em frente
28. Estruturas de
Programação
• Repetições
– Permitem a repetição de um conjunto de
ações (loop) enquanto determinada condição
for verdadeira ou falsa (FOR, WHILE, DO -
WHILE)
29. Exemplo - Estrutura de
Repetição
MOV R0, #16 ;repeticoes=16
LOOP1: ...
;sequencia de instrucoes
...
DJNZ R0, LOOP1 ;repete se R0!=0
MOV A, #20H ;repeticoes=32
LOOP2: ...
;sequencia de instrucoes
...
DEC A
JNZ LOOP2 ;repete se A!=0
30. Programa em C
void main(void)
{
unsigned char cont, soma=0;
for(cont=1; cont<10; cont++)
soma+=cont;
while(1);
} /* main*/
31. Resultado do Compilador
; FUNCTION main (BEGIN)
; SOURCE LINE # 3
0000 750000 R MOV soma,#000H
; R7 is assigned to cont
; SOURCE LINE # 5
0003 7F01 MOV R7,#001H
0005 ?FOR1:
; SOURCE LINE # 6
0005 E500 R MOV A,soma
0007 2F ADD A,R7
0008 F500 R MOV soma,A
; SOURCE LINE # 5
000A 0F INC R7
000B BF0AF7 CJNE R7,#00AH,?FOR1
000E ?WHILE1:
; SOURCE LINE # 8
000E 80FE SJMP ?WHILE1
; FUNCTION main (END)
33. Instruções Carga
12
1
XCHD A,@R0
Troca nibble inferior da RAM com
acumulador
XCHD A,@Ri
12
1
XCH A,@R0
Troca RAM indireto com A
XCH A,@Ri
12
2
XCH A,48h
Troca byte direto com A
XCH A,direto
24
2
POP DPH
Recupera byte direto da pilha
POP direto
24
2
PUSH R0
Move byte direto para pilha
PUSH direto
24
1
MOVC A,@A+PC
Move código contido no endereço A+PC
para o acumulador
MOVC A,@A+PC
24
1
MOVC A,@A+DPTR
Move código contido no endereço
A+DPTR para o acumulador
MOVC A,@A+DPTR
24
1
MOVX @DPTR,A
Move acumulador p/ RAM externa (end.
16 bits)
MOVX @DPTR,A
24
1
MOVX @R1,A
Move acumulador p/ RAM externa (end. 8
bits)
MOVX @Ri,A
24
1
MOVX A,DPTR
Move RAM externa (end. 16 bits) p/
acumulador
MOVX A,@DPTR
24
1
MOVX A,@R1
Move RAM externa (end. 8 bits) p/
acumulador
MOVX A,@Ri
Clk
B
Exemplo
Descrição
Instrução
34. Instruções Aritméticas
12
2
ADD A,#15
Subtrai dado imediato e borrow do
acumulador
SUBB A,#dado
12
1
ADD A,@R4
Subtrai RAM indireto e borrow do
acumulador
SUBB A,@Ri
12
2
ADD A,50h
Subtrai byte direto e borrow do acumulador
SUBB A,direto
12
1
ADD A,R2
Subtrai registro e borrow do acumulador
SUBB A,Rn
12
2
ADDC A,#15
Soma dado imediato ao acumulador e ao
carry
ADDC A,#dado
12
1
ADDC A,@R4
Soma RAM indireto ao acumulador e ao
carry
ADDC A,@Ri
12
2
ADDC A,50h
Soma byte direto ao acumulador e ao carry
ADDC A,direto
12
1
ADDC A,R2
Soma registro ao acumulador e ao carry
ADDC A,Rn
12
2
ADD A,#15
Soma dado imediato ao acumulador
ADD A,#dado
12
1
ADD A,@R4
Soma RAM indireto ao acumulador
ADD A,@Ri
12
2
ADD A,50h
Soma byte direto ao acumulador
ADD A,direto
12
1
ADD A,R2
Soma registro ao acumulador
ADD A,Rn
Clk
B
Exemplo
Descrição
Instrução
35. Instruções Aritméticas
12
1
DA A
Ajuste decimal do acumulador
DA A
48
1
DIV AB
Divide A por B
DIV AB
48
1
MUL AB
Multiplica A e B
MUL AB
24
1
INC DPTR
Incrementa data pointer
INC DPTR
12
1
DEC @R1
Decrementa RAM indireto
DEC @Ri
12
2
DEC 50h
Decrementa byte direto
DEC direto
12
1
DEC R3
Decrementa registro
DEC Rn
12
1
DEC A
Decrementa acumulador
DEC A
12
1
INC @R1
Incrementa RAM indireto
INC @Ri
12
2
INC 50h
Incrementa byte direto
INC direto
12
1
INC R3
Incrementa registro
INC Rn
12
1
INC A
Incrementa acumulador
INC A
Clk
B
Exemplo
Descrição
Instrução
36. Instruções Aritméticas
• Afetam flag C e OV : ADD; ADDC;
SUBB; MUL; DIV
• Afetam flag C : DA; RRC; RLC; SETB C;
CLR C; CPL C; ANL e ORL (C,bit e
C,/bit); MOV C,bit; CJNE
37. Instruções Lógicas
24
3
XRL 50h,#7Fh
XOR de byte direto com dado imediato
XRL direto,#dado
12
2
XRL 50h,A
XOR de byte direto com acumulador
XRL direto, A
12
2
XRL A,#15
XOR do acumulador com dado imediato
XRL A,#dado
12
1
XRL A,@R4
XOR do acumulador com RAM indireto
XRL A,@Ri
12
2
XRL A,50h
XOR do acumulador com byte direto
XRL A,direto
12
1
XRL A,R2
XOR do acumulador com registro
XRL A,Rn
24
3
ORL 50h,#7Fh
OR de byte direto com dado imediato
ORL direto,#dado
12
2
ORL 50h,A
OR de byte direto com acumulador
ORL direto, A
12
2
ORL A,#15
OR do acumulador com dado imediato
ORL A,#dado
12
1
ORL A,@R4
OR do acumulador com RAM indireto
ORL A,@Ri
12
2
ORL A,50h
OR do acumulador com byte direto
ORL A,direto
12
1
ORL A,R2
OR do acumulador com registro
ORL A,Rn
24
3
ANL 50h,#7Fh
AND de byte direto com dado imediato
ANL direto,#dado
12
2
ANL 50h,A
AND de byte direto com acumulador
ANL direto, A
12
2
ANL A,#15
AND do acumulador com dado imediato
ANL A,#dado
12
1
ANL A,@R4
AND do acumulador com RAM indireto
ANL A,@Ri
12
2
ANL A,50h
AND do acumulador com byte direto
ANL A,direto
12
1
ANL A,R2
AND do acumulador com registro
ANL A,Rn
Clk
B
Exemplo
Descrição
Instrução
38. Instruções Lógicas
12
1
SWAP A
Troca nibbles inferior e superior
SWAP A
12
1
RRC A
Rotaciona acumulador à direita com carry
RRC A
12
1
RR A
Rotaciona acumulador à direita
RR A
12
1
RLC A
Rotaciona acumulador à esquerda com carry
RLC A
12
1
RL A
Rotaciona acumulador à esquerda
RL A
12
1
CPL A
Complementa acumulador
CPL A
12
1
CLR A
Limpa acumulador
CLR A
Clk
B
Exemplo
Descrição
Instrução
Afetam flag C : RRC; RLC
39. Instruções Booleanas
24
2
MOV P1.0,C
Move carry p/ bit direto
MOV bit,C
12
2
MOV C,P1.0
Move bit direto p/ carry
MOV C,bit
24
2
ORL C,P1.5
OR do carry com bit direto complementado
ORL C,/bit
24
2
ORL C,P1.5
OR do carry com bit direto
ORL C,bit
24
2
ANL C,P1.5
AND do carry com bit direto
complementado
ANL C,/bit
24
2
ANL C,P1.5
AND do carry com bit direto
ANL C,bit
12
2
CPL P1.7
Complementa bit direto
CPL bit
12
1
CPL C
Complementa flag de carry
CPL C
12
2
SETB P1.7
Seta bit direto
SETB bit
12
1
SETB C
Seta flag de carry
SETB C
12
2
CLR P1.7
Limpa bit direto
CLR bit
12
1
CLR C
Limpa flag de carry
CLR C
Clk
B
Exemplo
Descrição
Instrução
Afetam flag C : SETB C; CLR C; CPL C; ANL e ORL (C,bit e
C,/bit); MOV C,bit
40. Instruções Booleanas
24
2
MOV P1.0,C
Move carry p/ bit direto
MOV bit,C
12
2
MOV C,P1.0
Move bit direto p/ carry
MOV C,bit
24
2
ORL C,P1.5
OR do carry com bit direto complementado
ORL C,/bit
24
2
ORL C,P1.5
OR do carry com bit direto
ORL C,bit
24
2
ANL C,P1.5
AND do carry com bit direto
complementado
ANL C,/bit
24
2
ANL C,P1.5
AND do carry com bit direto
ANL C,bit
12
2
CPL P1.7
Complementa bit direto
CPL bit
12
1
CPL C
Complementa flag de carry
CPL C
12
2
SETB P1.7
Seta bit direto
SETB bit
12
1
SETB C
Seta flag de carry
SETB C
12
2
CLR P1.7
Limpa bit direto
CLR bit
12
1
CLR C
Limpa flag de carry
CLR C
Clk
B
Exemplo
Descrição
Instrução
Afetam flag C : SETB C; CLR C; CPL C; ANL e ORL (C,bit e
C,/bit); MOV C,bit
41. Instruções de Desvio
24
3
JBC TF0,L1
Desvia se bit direto setado e reseta bit
JBC bit,relativo
24
2
JNB P1.0,DESVIO
Desvia se bit direto não setado
JNB bit,relativo
24
2
JB P1.0,LOOP
Desvia se bit direto setado
JB bit,relativo
24
2
JNC DESVIO
Desvia se flag de carry não setado
JNC relativo
24
2
JC LOOP
Desvia se flag de carry setado
JC relativo
Clk
B
Exemplo
Descrição
Instrução
42. Instruções de Desvio
24
2
JNZ REPETE
Desvia se acumulador diferente de zero
JNZ relativo
24
2
JZ SAI
Desvia se acumulador igual a zero
JZ relativo
24
1
JMP @A+DPTR
Desvio indireto relativo a DPTR
JMP @A+DPTR
24
2
SJMP LOOP1
Desvio curto (relativo)
SJMP relativo
24
3
LJMP SAIDA
Desvio longo
LJMP end16bits
24
2
AJMP LOOP
Desvio absoluto
AJMP end11bits
24
1
RETI
Retorno de rotina de interrupção
RETI
24
1
RET
Retorno de subrotina
RET
24
3
LCALL TECLAS
Desvio longo para subrotina
LCALL end16bits
24
2
ACALL DISP
Desvio absoluto para subrotina
ACALL end11bits
Clk
B
Exemplo
Descrição
Instrução
43. Instruções de Desvio
12
1
NOP
Sem operação
NOP
24
2
DJNZ 5Fh,LOOP
Decrementa byte direto e desvia se
diferente de 0
DJNZ direto,relativo
24
2
DJNZ R0,LOOP
Decrementa registro e desvia se
diferente de 0
DJNZ Rn,relativo
24
3
CJNE @R2,#20,L3
Compara dado c/ dado apontado por
registrador, se diferente, desvia
CJNE
@Rn,#dado,relativo
24
3
CJNE R2,#20,L3
Compara dado c/ registrador, se
diferente, desvia
CJNE Rn,#dado,relativo
24
3
CJNE A,#10,L3
Compara dado c/ acumulador, se
diferente, desvia
CJNE A,#dado,relativo
24
3
CJNE A,30h,L3
Compara byte direto c/ acumulador, se
diferente, desvia
CJNE A,direto,relativo
Clk
B
Exemplo
Descrição
Instrução
Afetam flag C : CJNE
44. Sobre o material
• Essas transparências foram baseadas
em materiais elaborados pelos
professores Hugo Vieira Neto,
Eduardo Bertonha e Gabriel
Kovalhuk