Você está na página 1de 15

CONJUNTO DE INSTRUES

O conjunto das instrues do 8051 pode ser dividido em 5 grupos: transferncia de dados, operaes lgicas, operaes aritmticas, manipulao de variveis booleanas e controle de programa. A seguir sero analisadas algumas das instrues de cada grupo.

Transferncia de Dados
Fazem parte do grupo de transferncia de dados as instrues MOV, MOVC, MOVX, PUSH, POP, XCH e XCHD. A instruo MOV copia o contedo de um endereo da memria de dados interna (ou uma constante) para outro endereo da memria de dados interna, utilizando a seguinte sintaxe: MOV <destino>, <fonte> O contedo do operando <fonte> copiado para o operando <destino>, sendo possvel utilizar todos os modos de endereamento (imediato, direto, indireto e registro). MOV A, #dado Carrega no acumulador o valor da constante de 8 bits (dado). O valor da constante pode estar em decimal (sem sufixo), hexadecimal (sufixo H) ou binrio (sufixo B). Exemplo: MOV A, #01010101B MOV A, direto Carrega no acumulador o contedo do endereo da memria de dados interna (direto). Exemplo: MOV A, 12H MOV A, @Ri Carrega no acumulador o contedo do endereo da memria de dados interna apontado pelo registro R0 ou R1 (@Ri). Exemplo: MOV A, @R0 MOV A, Rn Carrega no acumulador o contedo do registro R0, R1, R2, R3, R4, R5, R6 ou R7 (Rn) do banco de registros em uso. Exemplo: MOV A, R0 MOV DPTR, #dado16 Carrega no registro DPTR o valor da constante de 16 bits (dado16). Exemplo: MOV DPTR, #1234H

A instruo MOVC copia o contedo da memria de programa (interna ou externa) para o acumulador, utilizando a seguinte sintaxe: MOVC A, <fonte> O operando <fonte> sempre ir empregar o modo de endereamento indireto atravs de ponteiros. Trata-se da nica forma de leitura de constantes gravadas na memria de programa, como por exemplo, tabelas de dados (lookup tables). MOVC A, @A+DPTR Adiciona o valor contido no acumulador ao valor contido no registro de DPTR, utilizando o resultado como ponteiro para enderear uma posio da memria de programa e carrega o seu contedo no acumulador. A instruo MOVX copia o contedo de uma posio da memria de dados externa para o acumulador ou vice-versa, utilizando as seguintes sintaxes: MOVX A, <fonte> MOVX <destino>, A Os operandos <fonte> e <destino> sempre iro utilizar o modo de endereamento indireto atravs de ponteiros. Trata-se da nica forma de leitura ou escrita na memria de dados externa e de perifricos externos mapeados em memria. MOVX A, @DPTR Carrega o acumulador com o contedo da posio de memria de dados externa apontada pelo registro DPTR. MOVX @DPTR, A Carrega a posio de memria de dados externa apontada pelo registro DPTR com o contedo do acumulador. As instrues PUSH e POP trabalham com o armazenamento temporrio de dados, utilizando a seguinte sintaxe: PUSH <fonte> POP <destino> possvel utilizar apenas o modo de endereamento direto. PUSH direto O registro SP incrementado e em seguida o contedo do endereo da memria de dados interna (direto) carregado no topo da pilha. Exemplo: PUSH ACC

POP direto O topo da pilha carregado no endereo da memria de dados interna (direto). Em seguida o registro SP decrementado. Exemplo: POP ACC A instruo XCH efetua a troca de contedos entre o acumulador e um segundo operando, utilizando a seguinte sintaxe: XCH A, <operando> possvel utilizar todos os modos de endereamento (imediato, direto, indireto e registro). XCH A, direto Troca os contedos do acumulador e do endereo da memria de dados interna (direto). Exemplo: XCH A, 34H A instruo XCHD efetua a troca dos nibbles menos significativos entre o acumulador e um segundo operando, utilizando a seguinte sintaxe: XCHD A, <operando> possvel utilizar apenas o modo de endereamento indireto com ponteiros de 8 bits (R0 ou R1). XCHD A, @Ri Troca apenas o nibble menos significativo dos contedos do acumulador e do endereo da memria de dados interna apontada pelo registro R0 ou R1 (@Ri). Exemplo: XCHD A, @R0

Operaes Lgicas
Fazem parte do grupo de operaes lgicas as instrues CLR, CPL, ANL, ORL, XRL, RL, RLC, RR, RRC e SWAP. A instruo CLR zera o contedo do acumulador, possuindo uma nica sintaxe: CLR A CLR A Zera o contedo do acumulador.

A instruo CPL complementa o contedo do acumulador bit a bit, possuindo uma nica sintaxe: CPL A CPL A Complementa o contedo do acumulador bit a bit.

As instrues ANL, ORL e XRL realizam as operaes lgicas E, OU e OU-EXCLUSIVO, respectivamente, utilizando as seguintes sintaxes: ANL <operando1>, <operando2> ORL <operando1>, <operando2> XRL <operando1>, <operando2> O resultado da operao armazenado no <operando1>, que pode ser o acumulador ou uma posio da memria de dados interna endereada diretamente. O <operando2> pode utilizar todos os modos de endereamento (imediato, direto, indireto e registro). ANL A, #dado Efetua a operao lgica E entre o contedo do acumulador e a constante (dado) bit a bit. O resultado armazenado no acumulador. Exemplo: ANL A, #0FH

ORL A, direto Efetua a operao lgica OU entre o contedo do acumulador e o endereo da memria de dados interna (direto) bit a bit. O resultado armazenado no acumulador. Exemplo: ORL A, 3FH

XRL A, Rn Efetua a operao lgica OU-EXCLUSIVO entre o contedo do acumulador e o contedo do registro R0, R1, R2, R3, R4, R5, R6 ou R7 (Rn). O resultado armazenado no acumulador. Exemplo: XRL A, R1

As instrues RL e RLC deslocam o contedo do acumulador um bit esquerda, passando ou no pelo flag de carry. Possuem as seguintes sintaxes nicas: RL A RLC A RL A Desloca o contedo do acumulador 1 bit esquerda. O valor do bit 0 vai para o bit 1, o valor do bit 1 vai para o bit 2 e assim sucessivamente. O valor do bit 7 vai para o bit 0 e nenhum flag afetado. RLC A Desloca o contedo do acumulador 1 bit esquerda passando pelo flag de carry. O valor do bit 0 vai para o bit 1, o valor do bit 1 vai para o bit 2 e assim sucessivamente. valor do bit 7 vai para o flag de carry e o valor do flag de carry vai para o bit 0. As instrues RR e RRC deslocam o contedo do acumulador um bit esquerda, passando ou no pelo flag de carry. Possuem as seguintes sintaxes nicas: RR A RRC A RR A Desloca o contedo do acumulador 1 bit direita. O valor do bit 7 vai para o bit 6, o valor do bit 6 vai para o bit 5 e assim sucessivamente. O valor do bit 0 vai para o bit 7 e nenhum flag afetado. RRC A Desloca o contedo do acumulador 1 bit direita passando pelo flag de carry. O valor do bit 7 vai para o bit 6, o valor do bit 6 vai para o bit 5 e assim sucessivamente. valor do bit 0 vai para o flag de carry e o valor do flag de carry vai para o bit 7. A instruo SWAP troca o nibble mais significativo pelo nibble menos significativo do acumulador, possuindo a seguinte sintaxe nica: SWAP A SWAP A Troca o nibble mais significativo pelo nibble menos significativo do acumulador.

Operaes Aritmticas
Fazem parte do grupo de operaes aritmticas as instrues ADD, ADDC, SUBB, INC, DEC, MUL, DIV e DA. A instruo ADD realiza a adio entre o contedo do acumulador e o contedo de um endereo da memria de dados interna (ou uma constante), utilizando a seguinte sintaxe: ADD A, <operando> O resultado da adio armazenado no acumulador, sendo possvel utilizar para o <operando> todos os modos de endereamento (imediato, direto, indireto e registro). O flag de carry afetado conforme o resultado da operao.

ADD A, Rn Adiciona o contedo do acumulador ao contedo do registro R0, R1, R2, R3, R4, R5, R6 ou R7 (Rn). O resultado armazenado no acumulador e o flag de carry afetado conforme o resultado da operao. Exemplo: ADD A, R2

A instruo ADDC realiza a adio entre o contedo do acumulador, o contedo de uma posio da memria de dados interna (ou uma constante) e o flag de carry, utilizando a seguinte sintaxe: ADDC A, <operando> O resultado da adio armazenado no acumulador, sendo possvel utilizar para o <operando> todos os modos de endereamento (imediato, direto, indireto e registro). O flag de carry afetado conforme o resultado da operao. Esta instruo permite que adies com mais de 8 bits possam ser implementadas graas ao aproveitamento do flag de carry da operao anterior. ADDC A, @Ri Adiciona o contedo do acumulador ao contedo do endereo da memria de dados interna apontado por R0 ou R1 (@Ri) e ao flag de carry. O resultado armazenado no acumulador e o flag de carry afetado conforme o resultado da operao. Exemplo: ADDC A, @R0

A instruo SUBB realiza a subtrao entre o contedo do acumulador, o contedo de uma posio da memria de dados interna (ou uma constante) e o flag de carry (borrow), utilizando a seguinte sintaxe: SUBB A, <operando> O resultado da subtrao armazenado no acumulador, sendo possvel utilizar para o <operando> todos os modos de endereamento (imediato, direto, indireto e registro). O flag de carry (borrow) afetado conforme o resultado da operao. Esta instruo permite que subtraes com mais de 8 bits possam ser implementadas graas ao aproveitamento do flag de carry (borrow) da operao anterior. SUBB A, @Ri Subtrai do contedo do acumulador o contedo do endereo da memria de dados interna apontado por R0 ou R1 (@Ri) e o flag de carry (borrow). O resultado armazenado no acumulador e o flag de carry (borrow) afetado conforme o resultado da operao. Exemplo: SUBB A, @R1

A instruo INC incrementa o operando de uma unidade, utilizando a seguinte sintaxe: INC <operando> possvel utilizar todos os modos de endereamento (imediato, direto, indireto e registro) e ainda o registro de 16 bits DPTR. INC DPTR Incrementa o valor do registro de 16 bits DPTR.

A instruo DEC decrementa o operando de uma unidade, utilizando a seguinte sintaxe: DEC <operando> possvel utilizar todos os modos de endereamento (imediato, direto, indireto e registro). DEC A Decrementa o valor do acumulador.

A instruo MUL realiza a multiplicao entre o acumulador e o registro de funo especial B, possuindo uma nica sintaxe: MUL AB MUL AB Multiplica o contedo do acumulador pelo contedo do registro de funo especial B, armazenando a parte mais significativa do resultado em B e a parte menos significativa no acumulador.

A instruo DIV realiza a diviso entre o acumulador e o registro de funo especial B, possuindo uma nica sintaxe: DIV AB DIV AB Divide o contedo do acumulador pelo contedo do registro de funo especial B, armazenando o quociente no acumulador e o resto em B. Se B for nulo o resultado da operao ser indefinido.

A instruo DA realiza o ajuste decimal do acumulador aps operaes de adio em BCD, possuindo uma nica sintaxe: DA A

DA A Realiza o ajuste decimal do acumulador. Deve ser utilizada apenas aps operaes de adio cujos operandos estejam codificados em BCD. O flag de carry afetado conforme o resultado do ajuste.

Manipulao de Variveis Booleanas (Bits)


Fazem parte do grupo de manipulao de variveis booleanas as instrues CLR, SETB, CPL, ANL, ORL, e MOV. A instruo CLR reseta uma varivel booleana, possuindo a seguinte sintaxe: CLR <operando> O <operando> corresponde ao endereo individual do bit que deseja-se zerar (da regio da memria interna de dados enderevel bit-a-bit ou de um registro de funo especial enderevel bit-a-bit). CLR bit Reseta o valor da varivel booleana endereada (bit). Exemplo: CLR 35H

A instruo SETB seta uma varivel booleana, possuindo a seguinte sintaxe: SETB <operando> O <operando> corresponde ao endereo individual do bit que deseja-se setar (da regio da memria interna de dados enderevel bit-a-bit ou de um registro de funo especial enderevel bit-a-bit). SETB bit Seta o valor da varivel booleana endereada (bit). Exemplo: SETB TR0

A instruo CPL complementa uma varivel booleana, possuindo a seguinte sintaxe: CPL <operando> O <operando> corresponde ao endereo individual do bit que deseja-se complementar (da regio da memria interna de dados enderevel bit-a-bit ou de um registro de funo especial enderevel bit-a-bit). CPL bit Complementa o valor da varivel booleana endereada (bit). Exemplo: CPL C

As instrues ANL, e ORL realizam as operaes lgicas E e OU com o flag de carry, respectivamente, utilizando as seguintes sintaxes: ANL C, <operando> ORL C, <operando>

O resultado da operao armazenado no flag de carry e o <operando> pode ser o endereo individual do bit (da regio da memria interna de dados enderevel bit-a-bit ou de um registro de funo especial enderevel bit-a-bit) ou seu complemento. ANL C, bit Efetua a operao lgica E entre o flag de carry e a varivel booleana endereada (bit). Exemplo: ANL C, 08H ORL C, /bit Efetua a operao lgica OU entre o flag de carry e o complemento da varivel booleana endereada (bit). Exemplo: ORL C, /EA A instruo MOV copia o estado de uma varivel booleana para o flag de carry ou vice-versa, utilizando as seguintes sintaxes: MOV C, <fonte> MOV <destino>, C Os operandos <fonte> e <destino> deve ser o endereo individual do bit (dever fazer parte da regio da memria interna de dados enderevel bit-a-bit ou de um registro de funo especial enderevel bit-a-bit). MOV C, bit Copia o estado da varivel booleana endereada (bit) para o flag de carry. Exemplo: MOV C, 90H

Controle de Programa
Fazem parte do grupo de controle de programa as instrues LJMP, AJMP, SJMP, JMP, LCALL, ACALL, RET, RETI, JNZ, JZ, JNC, JC, JNB, JB, JBC, CJNE, DJNZ e NOP. Este grupo de instrues atua em endereos da memria de programa, causando desvios na seqncia natural de execuo do programa (registro de funo especial PC). As instrues LJMP, AJMP e SJMP so instrues de desvio incondicional e possuem as seguintes sintaxes: LJMP <endereo> AJMP <endereo> SJMP <endereo> JMP @A+DPTR O <endereo> da instruo LJMP um endereo de 16 bits da memria de programa. Atravs dessa instruo possvel realizar desvios para qualquer endereo dos 64Kb de memria de programa. LJMP end16 Efetua um desvio incondicional da execuo para o endereo (end16) da memria de programa. Exemplo: LJMP 2000H O <endereo> da instruo AJMP um endereo de 11 bits da memria de programa. Atravs dessa instruo possvel realizar desvios apenas para a mesma pgina de 2Kb da memria de programa onde encontrase a referida instruo. AJMP end11 Efetua um desvio incondicional da execuo na mesma pgina de 2Kb da memria de programa. O endereo de 16 bits do desvio obtido pela CPU completando os 11 bits (end11) com os 5 bits mais significativos do endereo contido no registro de funo especial PC. Exemplo: AJMP DESVIO O <endereo> da instruo SJMP um valor de 8 bits correspondente ao deslocamento relativo desejado em relao ao atual endereo de execuo (registro de funo especial PC). Atravs dessa instruo possvel realizar desvios relativos de 128 a +127 posies na memria de programa, pois o deslocamento dado em complemento de dois. SJMP rel Efetua um desvio incondicional relativo da execuo do programa. O endereo de 16 bits do desvio obtido pela CPU somando-se o valor relativo (rel) ao endereo contido no registro de funo especial PC. Exemplo: SJMP VOLTA

As instrues LCALL e ACALL so instrues de chamadas de subrotinas (funes) e possuem as seguintes sintaxes: LCALL <endereo> ACALL <endereo> O <endereo> da instruo LCALL um endereo de 16 bits da memria de programa. Atravs dessa instruo possvel realizar chamadas de subrotinas em qualquer endereo dos 64Kb de memria de programa. LCALL end16 Salva o contedo do registro de funo especial PC na pilha (o registro SP incrementado 2 vezes, pois trata-se de um registro de 16 bits). Em seguida efetua um desvio para o endereo da subrotina (end16). O valor salvo na pilha constitui o endereo de retorno a ser restaurado pela instruo RET ao final da subrotina. Exemplo: LCALL 3000H O <endereo> da instruo ACALL um endereo de 11 bits da memria de programa. Atravs dessa instruo possvel realizar chamadas de subrotinas apenas para a mesma pgina de 2Kb da memria de programa onde encontra-se a referida instruo. ACALL end11 Salva o contedo do registro de funo especial PC na pilha (o registro SP incrementado 2 vezes, pois trata-se de um registro de 16 bits). Em seguida efetua um desvio para o endereo da subrotina (end11) na mesma pgina de 2KB da memria de programa. O valor salvo na pilha constitui o endereo de retorno a ser restaurado pela instruo RET ao final da subrotina. Exemplo: ACALL TEMPO As instrues RET e RETI so instrues que realizam o retorno de chamadas de subrotinas e interrupes, respectivamente, possuindo as seguintes sintaxes: RET RETI As instrues de retorno recuperam o endereo original contido no registro de funo especial PC no momento da chamada da subrotina ou interrupo. RET Retorna de uma subrotina. O endereo de retorno recuperado da pilha e armazenado no registro de funo especial PC (o registro SP decrementado 2 vezes, pois trata-se de um registro de 16 bits). Exemplo: RET

RETI Retorna de uma subrotina. O endereo de retorno recuperado da pilha e armazenado no registro de funo especial PC (o registro SP decrementado 2 vezes, pois trata-se de um registro de 16 bits). A diferena em relao instruo RET que a instruo RETI habilita novamente interrupes de menor ou igual prioridade, anteriormente desabilitadas na ocorrncia da interrupo. Exemplo: RETI As instrues JNZ, JZ, JNC e JC so instrues de desvio condicional e possuem as seguintes sintaxes: JNZ JZ JNC JC <endereo> <endereo> <endereo> <endereo>

A condio de desvio dada pelo mnemnico da instruo utilizada: JNZ efetua um desvio se o contedo do acumulador for diferente de zero, JZ efetua um desvio se o contedo do acumulador for igual de zero, JNC efetua um desvio se o estado do flag de carry for igual a zero e JC efetua um desvio se o estado do flag de carry for igual a um. O <endereo> de todas essas instrues sempre um valor de 8 bits correspondente ao deslocamento do desvio relativo desejado em relao ao atual endereo de execuo (registro de funo especial PC). Atravs dessa instruo possvel realizar desvios relativos de 128 a +127 posies na memria de programa, pois o deslocamento dado em complemento de dois. JNZ rel Testa o contedo do acumulador e efetua um desvio relativo no programa se for diferente de zero. O endereo de 16 bits do desvio obtido pela CPU somando-se o valor relativo (rel) ao endereo contido no registro de funo especial PC, se o resultado do teste for verdadeiro. Exemplo: JNZ VOLTA JZ rel Testa o contedo do acumulador e efetua um desvio relativo no programa se for igual a zero. O endereo de 16 bits do desvio obtido pela CPU somando-se o valor relativo (rel) ao endereo contido no registro de funo especial PC, se o resultado do teste for verdadeiro. Exemplo: JZ ZERO JNC rel Testa o flag de carry e efetua um desvio relativo no programa se for igual a zero. O endereo de 16 bits do desvio obtido pela CPU somando-se o valor relativo (rel) ao endereo contido no registro de funo especial PC, se o resultado do teste for verdadeiro. Exemplo: JNC SEM

JC rel Testa o flag de carry e efetua um desvio relativo no programa se for igual a um. O endereo de 16 bits do desvio obtido pela CPU somando-se o valor relativo (rel) ao endereo contido no registro de funo especial PC, se o resultado do teste for verdadeiro. Exemplo: JC CARRY As instrues JNB, JB e JBC tambm so instrues de desvio condicional, porm utilizando variveis booleanas genricas para o teste da condio. Possuem as seguintes sintaxes: JNB <operando>, <endereo> JB <operando>, <endereo> JBC <operando>, <endereo> A condio de desvio dada pelo mnemnico da instruo utilizada: JNB efetua um desvio se o estado da varivel booleana for igual a zero, JB efetua um desvio se o estado da varivel booleana for igual a um e JBC efetua um desvio se o estado da varivel booleana for igual a um, posteriormente resetando-a. Em todas essas instrues o <operando> sempre o endereo individual de um bit (da regio da memria interna de dados enderevel bit-abit ou de um registro de funo especial enderevel bit-a-bit) e o <endereo> sempre um valor de 8 bits correspondente ao deslocamento do desvio relativo desejado em relao ao atual endereo de execuo (registro de funo especial PC). O deslocamento dado em complemento de dois. JNB bit, rel Testa a varivel booleana endereada (bit) e efetua um desvio relativo no programa se for igual a zero. O endereo de 16 bits do desvio obtido pela CPU somando-se o valor relativo (rel) ao endereo contido no registro de funo especial PC, se o resultado do teste for verdadeiro. Exemplo: JNB EA, INTERR JB bit, rel Testa a varivel booleana endereada (bit) e efetua um desvio relativo no programa se for igual a um. O endereo de 16 bits do desvio obtido pela CPU somando-se o valor relativo (rel) ao endereo contido no registro de funo especial PC, se o resultado do teste for verdadeiro. Exemplo: JB TF1, TIME JBC bit, rel Testa a varivel booleana endereada (bit) e efetua um desvio relativo no programa se for igual a um, posteriormente resetando-a. O endereo de 16 bits do desvio obtido pela CPU somando-se o valor relativo (rel) ao endereo contido no registro de funo especial PC, se o resultado do teste for verdadeiro. Exemplo: JBC 20H, SINAL

A instruo CJNE realiza uma comparao entre 2 operandos e, caso no sejam iguais, efetua um desvio na execuo do programa. Possui a seguinte sintaxe: CJNE <operando1>, <operando2>, <endereo> O <operando1> pode ser o acumulador, um registro do banco de registros em uso ou um ponteiro, o <operando2> pode ser um endereo da memria de dados interna ou uma constante e o <endereo> sempre um valor de 8 bits correspondente ao deslocamento do desvio relativo desejado, a ser efetuado no caso do <operando1> e do <operando2> serem diferentes. O deslocamento dado em complemento de dois. CJNE A, direto, rel Compara o contedo do acumulador com o contedo da posio de memria de dados interna (direto). Se os valores forem iguais, o programa prossegue normalmente para a prxima instruo. Caso contrrio, um desvio realizado pela CPU somando-se o valor relativo (rel) ao endereo contido no registro de funo especial PC. Exemplo: CJNE A, 1FH, TECLA A instruo DJNZ realiza uma decremento e, caso o resultado seja diferente de zero, efetua um desvio na execuo do programa. Possui a seguinte sintaxe: DJNZ <operando>, <endereo> O <operando> pode ser um registro do banco de registros em uso ou um endereo da memria de dados interna ou uma constante e o <endereo> sempre um valor de 8 bits correspondente ao deslocamento do desvio relativo desejado, a ser efetuado no caso do <operando1> ser diferente de zero. O deslocamento dado em complemento de dois. DJNZ Rn, rel Decrementa o contedo do registro R0 a R7 (Rn) do banco de registros em uso, ocorrendo um desvio no programa caso o resultado seja diferente de zero. Se o resultado aps o decremento for nulo o programa prossegue para a prxima instruo. Caso ocorra um desvio, o endereo de desvio calculado pela CPU somando-se o valor relativo (rel) ao endereo contido no registro de funo especial PC. Exemplo: DJNZ R0, LOOP A instruo NOP aguarda o tempo de um ciclo de mquina da CPU sem efetuar nenhuma operao. Possui a seguinte sintaxe: NOP NOP Sem operao, apenas aguarda o tempo relativo a um ciclo de mquina. Exemplo: NOP