Conjunto de Instruções e Modos de Endereçamento
Nesse exemplo, a diretiva ORG <número> determina a posição da memória em que a próxima instrução será colocada na memória de programa. Já a diretiva END indica o fim do programa.
Modos de Endereçamento
Direto:
O endereço do operando é determinado pela própria instrução (endereço de 8 bits).
Neste caso, apenas a RAM interna e os registradores especiais podem ser acessados.
Indireto:
O endereço do operando é determinado por um registrador.
Um endereço de 8 bits pode ser determinado pelos registradores R0~R1 do banco de registradores atual, ou pelo Stack Pointer.
Endereços de 16 bits só podem ser especificados pelo registrador DPTR.
Imediato:
O operando é a constante.
Registrador:
Os registradores R0~R7 do banco atual são acessados pela instrução.
Registrador Específico:
A operação da instrução é realizada em um registrador específico.
Neste caso, não é necessário indicar um endereço.
Indexado:
Somente a memória de programa pode ser acessada.
Apenas operações de leitura são possíveis.
Utilizado em instruções de salto e look-up table.
No último modo, os registradores PC e DPTR podem ser usados para armazenar um endereço base. Já o acumulador é utilizado para determinar o offset.
Símbolos utilizados:
C: Flag de carry;
A: Acumulador;
PC: Contador de Programa;
DPTR: Ponteiro;
N: Endereço de 8 bits;
NN: Endereço de 16 bits;
#N: Constante de 8 bits;
Rn: Registrador Rn (R0~R7) do banco atual de registradores;
@Ri: Endereço é determinado pelo registrador Ri (R0 ou R1);
H: indica que o valor está na base hexadecimal;
B: indica que o valor está na base binária;
Instruções de Movimentação de Dados
De modo geral, quando o destino é o acumulador:
Quando o destino é um registrador:
Quando o destino é um endereço direto:
Quando o destino é um endereço indireto:
Instruções Aritméticas
Quando o destino é o acumulador:
Cabe ressaltar que nas operações de adição, subtração e incremento o flag de carry e de overflow são alterados. As operações de multiplicação e divisão zeram o flag de carry, e no caso da multiplicação, a flag de overflow é modificada. Além disso, a instrução de ajuste decimal também modifica a flag de carry.
Quando o destino é um registrador:
Instruções Lógicas
Quando o destino é o acumulador:
Quando o destino é um endereço direto:
Operação sobre o acumulador:
Instruções Booleanas e de Desvio
Operações utilizando o endereçamento de bits:
Operações sobre o flag de Carry:
Instruções de Salto
Instruções de salto incondicional são bastante simples. Basicamente, um endereço alvo é utilizado para alterar o fluxo de execução, isto é, o contador de programa. Na figura são mostradas as instruções capazes de alterar o fluxo de execução do programa, com exceção da instrução NOP, que não realiza nenhuma operação.
As instruções JMP e CALL possuem as seguintes variações:
Outras duas instruções que alteram o valor do contador de programa são as de retorno de sub-rotina e retorno de interrupção.
O desvio também pode ser tomado com base no resultado de uma comparação. Nesse caso, o desvio é dito condicional.
Cabe ressaltar que as instruções CJNE modificam a flag de carry.
Exemplo de acesso a memória externa: Zera os elementos de um vetor que são iguais a FFH.
Exemplo de acesso a memória externa: Copia os dados de um vetor para outro.
Last updated