gs 0908 assembly 8051 v0 - páginas pessoais -...
TRANSCRIPT
Sistemas Microprocessados
sato<at>utfpr<dot>edu<dot>brhttp://pessoal.utfpr.edu.br/sato/
Assembly do 8051
sato<at>utfpr<dot>edu<dot>br
Sobre o material
• Essas transparências foram baseadas em materiais elaborados pelos professores Hugo Vieira Neto, Eduardo Bertonha e Gabriel Kovalhuk
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
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
Assembly
Assembler
Memória
ISP, gravador, etc
MOV A, #1C
ADD A, #F2
mnemônicos
01110100
00011100
00100100
11110010
opcodes
AssemblyCLR C ;faz carry=0SUBB A, R0 ;subtrai R0 de AJZ IGUAL ;se R0=A salta para IGUALJC MAIOR ;se R0>A salta para MAIOR
MENOR: MOV R1, #01 ;sinaliza em R1 que R0<ASJMP FIM
MAIOR: MOV R1, #02 ;sinaliza em R1 que R0>ASJMP FIM
IGUAL: MOV R1, #00 ;sinaliza em R1 que R0=AFIM: ;segue em frente
ComentáriosLabels
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
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
Conjunto de Instruções
• Lógicas– ANL, ORL, XRL, CLR, CPL, – RL, RLC, RR, RRC, SWAP
• Booleanas (bits)– CLR, SETB, CPL, ANL, ORL
– MOV
Conjunto de Instruções
• Desvio– ACALL, LCALL, RET, RETI
– AJMP, LJMP, SJMP, JMP– JZ, JNZ, JC, JNC, JB, JNB, JBC– CJNE, DJNZ
– NOP
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 (#)
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
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
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
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)
Diretivas do Assembler
• ORG exp• END exp• label: DB exp• label: DW exp• label: LONG exp• label: ASCII exp• label: EQU val
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
Resultado do MontadorLOC 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
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
Exemplo - PilhaPUSH 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
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
Exemplo - SubrotinaINICIO: 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
Estruturas de Programação
• Interrupções– São funções (rotinas) chamadas por
hardware– Possuem endereços fixos (vetores de
interrupção)
Exemplo - InterrupçãoTIMER0: 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
Estruturas de Programação
• Decisões– Desviam o fluxo de execução do programa
conforme determinada condição for verdadeira ou falsa (IF - ELSE)
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
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)
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
Programa em C
void main(void)
{
unsigned char cont, soma=0;
for(cont=1; cont<10; cont++)
soma+=cont;
while(1);
} /* main*/
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,#001H0005 ?FOR1:
; SOURCE LINE # 6 0005 E500 R MOV A,soma0007 2F ADD A,R70008 F500 R MOV soma,A
; SOURCE LINE # 5 000A 0F INC R7000B BF0AF7 CJNE R7,#00AH,?FOR1000E ?WHILE1:
; SOURCE LINE # 8 000E 80FE SJMP ?WHILE1
; FUNCTION main (END)
Instruções Carga
243MOV DPTR,#2000hMove 2 bytes p/ data pointer MOV DPTR,#dado16
122MOV @R4,#0FhMove dado imediato p/ RAM indiretoMOV @Ri,#dado
242MOV @R3,40hMove byte direto p/ RAM indiretoMOV @Ri,direto
121MOV @R4,AMove acumulador p/ RAM indiretoMOV @Ri,A
242MOV 40h,#100Move dado imediato p/ byte direto MOV direto,#dado
242MOV 7Fh,@R0Move RAM indireto p/ byte direto MOV direto,@Ri
243MOV 7Fh,30hMove byte direto p/ byte direto MOV direto,direto
242MOV 7Fh,R1Move registro p/ byte direto MOV direto,Rn
122MOV 7Fh,AMove acumulador p/ byte direto MOV direto,A
122MOV R6,#200Move dado imediato p/ registroMOV Rn,#dado
242MOV R3,7FhMove byte direto p/ registroMOV Rn,direto
121MOV R7,AMove acumulador p/ registroMOV Rn,A
122MOV A,#20Move dado imediato p/ acumuladorMOV A,#dado
121MOV A,@R4Move RAM indireto p/ acumuladorMOV A,@Ri
122MOV A,7FhMove byte direto p/ acumuladorMOV A,direto
121MOV A,R2Move registro p/ acumuladorMOV A,Rn
ClkBExemploDescriçãoInstrução
Instruções Carga
121XCHD A,@R0Troca nibble inferior da RAM com acumulador
XCHD A,@Ri
121XCH A,@R0Troca RAM indireto com AXCH A,@Ri
122XCH A,48hTroca byte direto com AXCH A,direto
242POP DPHRecupera byte direto da pilhaPOP direto
242PUSH R0Move byte direto para pilhaPUSH direto
241MOVC A,@A+PCMove código contido no endereço A+PC para o acumulador
MOVC A,@A+PC
241MOVC A,@A+DPTRMove código contido no endereço A+DPTR para o acumulador
MOVC A,@A+DPTR
241MOVX @DPTR,AMove acumulador p/ RAM externa (end. 16 bits)
MOVX @DPTR,A
241MOVX @R1,AMove acumulador p/ RAM externa (end. 8 bits)
MOVX @Ri,A
241MOVX A,DPTRMove RAM externa (end. 16 bits) p/ acumulador
MOVX A,@DPTR
241MOVX A,@R1Move RAM externa (end. 8 bits) p/ acumulador
MOVX A,@Ri
ClkBExemploDescriçãoInstrução
Instruções Aritméticas
122ADD A,#15Subtrai dado imediato e borrow do acumulador
SUBB A,#dado
121ADD A,@R4Subtrai RAM indireto e borrow do acumulador
SUBB A,@Ri
122ADD A,50hSubtrai byte direto e borrow do acumuladorSUBB A,direto
121ADD A,R2Subtrai registro e borrow do acumuladorSUBB A,Rn
122ADDC A,#15Soma dado imediato ao acumulador e ao carry
ADDC A,#dado
121ADDC A,@R4Soma RAM indireto ao acumulador e ao carry
ADDC A,@Ri
122ADDC A,50hSoma byte direto ao acumulador e ao carryADDC A,direto
121ADDC A,R2Soma registro ao acumulador e ao carryADDC A,Rn
122ADD A,#15Soma dado imediato ao acumuladorADD A,#dado
121ADD A,@R4Soma RAM indireto ao acumuladorADD A,@Ri
122ADD A,50hSoma byte direto ao acumuladorADD A,direto
121ADD A,R2Soma registro ao acumuladorADD A,Rn
ClkBExemploDescriçãoInstrução
Instruções Aritméticas
121DA AAjuste decimal do acumuladorDA A
481DIV ABDivide A por BDIV AB
481MUL ABMultiplica A e BMUL AB
241INC DPTRIncrementa data pointerINC DPTR
121DEC @R1Decrementa RAM indiretoDEC @Ri
122DEC 50hDecrementa byte diretoDEC direto
121DEC R3Decrementa registroDEC Rn
121DEC ADecrementa acumuladorDEC A
121INC @R1Incrementa RAM indiretoINC @Ri
122INC 50hIncrementa byte diretoINC direto
121INC R3Incrementa registroINC Rn
121INC AIncrementa acumuladorINC A
ClkBExemploDescriçãoInstrução
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
Instruções Lógicas
243XRL 50h,#7FhXOR de byte direto com dado imediatoXRL direto,#dado
122XRL 50h,AXOR de byte direto com acumulador XRL direto, A
122XRL A,#15XOR do acumulador com dado imediato XRL A,#dado
121XRL A,@R4XOR do acumulador com RAM indiretoXRL A,@Ri
122XRL A,50hXOR do acumulador com byte direto XRL A,direto
121XRL A,R2XOR do acumulador com registroXRL A,Rn
243ORL 50h,#7FhOR de byte direto com dado imediatoORL direto,#dado
122ORL 50h,AOR de byte direto com acumulador ORL direto, A
122ORL A,#15OR do acumulador com dado imediato ORL A,#dado
121ORL A,@R4OR do acumulador com RAM indiretoORL A,@Ri
122ORL A,50hOR do acumulador com byte direto ORL A,direto
121ORL A,R2OR do acumulador com registroORL A,Rn
243ANL 50h,#7FhAND de byte direto com dado imediatoANL direto,#dado
122ANL 50h,AAND de byte direto com acumulador ANL direto, A
122ANL A,#15AND do acumulador com dado imediato ANL A,#dado
121ANL A,@R4AND do acumulador com RAM indiretoANL A,@Ri
122ANL A,50hAND do acumulador com byte direto ANL A,direto
121ANL A,R2AND do acumulador com registroANL A,Rn
ClkBExemploDescriçãoInstrução
Instruções Lógicas
121SWAP ATroca nibbles inferior e superiorSWAP A
121RRC ARotaciona acumulador à direita com carryRRC A
121RR ARotaciona acumulador à direitaRR A
121RLC ARotaciona acumulador à esquerda com carryRLC A
121RL ARotaciona acumulador à esquerdaRL A
121CPL AComplementa acumuladorCPL A
121CLR ALimpa acumuladorCLR A
ClkBExemploDescriçãoInstrução
Afetam flag C : RRC; RLC
Instruções Booleanas
242MOV P1.0,CMove carry p/ bit diretoMOV bit,C
122MOV C,P1.0Move bit direto p/ carryMOV C,bit
242ORL C,P1.5OR do carry com bit direto complementadoORL C,/bit
242ORL C,P1.5OR do carry com bit diretoORL C,bit
242ANL C,P1.5AND do carry com bit direto complementado
ANL C,/bit
242ANL C,P1.5AND do carry com bit diretoANL C,bit
122CPL P1.7Complementa bit diretoCPL bit
121CPL CComplementa flag de carryCPL C
122SETB P1.7Seta bit diretoSETB bit
121SETB CSeta flag de carrySETB C
122CLR P1.7Limpa bit diretoCLR bit
121CLR CLimpa flag de carryCLR C
ClkBExemploDescriçãoInstrução
Afetam flag C : SETB C; CLR C; CPL C; ANL e ORL (C,b it e C,/bit); MOV C,bit
Instruções Booleanas
242MOV P1.0,CMove carry p/ bit diretoMOV bit,C
122MOV C,P1.0Move bit direto p/ carryMOV C,bit
242ORL C,P1.5OR do carry com bit direto complementadoORL C,/bit
242ORL C,P1.5OR do carry com bit diretoORL C,bit
242ANL C,P1.5AND do carry com bit direto complementado
ANL C,/bit
242ANL C,P1.5AND do carry com bit diretoANL C,bit
122CPL P1.7Complementa bit diretoCPL bit
121CPL CComplementa flag de carryCPL C
122SETB P1.7Seta bit diretoSETB bit
121SETB CSeta flag de carrySETB C
122CLR P1.7Limpa bit diretoCLR bit
121CLR CLimpa flag de carryCLR C
ClkBExemploDescriçãoInstrução
Afetam flag C : SETB C; CLR C; CPL C; ANL e ORL (C,b it e C,/bit); MOV C,bit
Instruções de Desvio
243JBC TF0,L1Desvia se bit direto setado e reseta bitJBC bit,relativo
242JNB P1.0,DESVIODesvia se bit direto não setadoJNB bit,relativo
242JB P1.0,LOOPDesvia se bit direto setadoJB bit,relativo
242JNC DESVIODesvia se flag de carry não setadoJNC relativo
242JC LOOPDesvia se flag de carry setadoJC relativo
ClkBExemploDescriçãoInstrução
Instruções de Desvio
242JNZ REPETEDesvia se acumulador diferente de zeroJNZ relativo
242JZ SAIDesvia se acumulador igual a zeroJZ relativo
241JMP @A+DPTRDesvio indireto relativo a DPTRJMP @A+DPTR
242SJMP LOOP1Desvio curto (relativo)SJMP relativo
243LJMP SAIDADesvio longo LJMP end16bits
242AJMP LOOPDesvio absolutoAJMP end11bits
241RETIRetorno de rotina de interrupçãoRETI
241RETRetorno de subrotinaRET
243LCALL TECLASDesvio longo para subrotinaLCALL end16bits
242ACALL DISPDesvio absoluto para subrotinaACALL end11bits
ClkBExemploDescriçãoInstrução
Instruções de Desvio
121NOPSem operaçãoNOP
242DJNZ 5Fh,LOOPDecrementa byte direto e desvia se diferente de 0
DJNZ direto,relativo
242DJNZ R0,LOOPDecrementa registro e desvia se diferente de 0
DJNZ Rn,relativo
243CJNE @R2,#20,L3Compara dado c/ dado apontado por registrador, se diferente, desvia
CJNE @Rn,#dado,relativo
243CJNE R2,#20,L3Compara dado c/ registrador, se diferente, desvia
CJNE Rn,#dado,relativo
243CJNE A,#10,L3Compara dado c/ acumulador, se diferente, desvia
CJNE A,#dado,relativo
243CJNE A,30h,L3Compara byte direto c/ acumulador, se diferente, desvia
CJNE A,direto,relativo
ClkBExemploDescriçãoInstrução
Afetam flag C : CJNE
Sobre o material
• Essas transparências foram baseadas em materiais elaborados pelos professores Hugo Vieira Neto, Eduardo Bertonha e Gabriel Kovalhuk