Microprocessador - conjuntos de instruções 8086
O microprocessador 8086 suporta 8 tipos de instruções -
- Instruções de transferência de dados
- Instruções Aritméticas
- Instruções de manipulação de bits
- Instruções de string
- Instruções de transferência de execução do programa (instruções de filial e loop)
- Instruções de controle do processador
- Instruções de controle de iteração
- Instruções de interrupção
Vamos agora discutir esses conjuntos de instruções em detalhes.
Instruções de transferência de dados
Essas instruções são utilizadas para transferir os dados do operando de origem para o operando de destino. A seguir está a lista de instruções deste grupo -
Instrução para transferir uma palavra
MOV - Usado para copiar o byte ou palavra da fonte fornecida para o destino fornecido.
PPUSH - Usado para colocar uma palavra no topo da pilha.
POP - Usado para obter uma palavra do topo da pilha para o local fornecido.
PUSHA - Usado para colocar todos os registros na pilha.
POPA - Usado para obter palavras da pilha para todos os registros.
XCHG - Usado para trocar os dados de dois locais.
XLAT - Usado para traduzir um byte em AL usando uma tabela na memória.
Instruções para transferência de porta de entrada e saída
IN - Usado para ler um byte ou palavra da porta fornecida para o acumulador.
OUT - Usado para enviar um byte ou palavra do acumulador para a porta fornecida.
Instruções para transferir o endereço
LEA - Usado para carregar o endereço do operando no registro fornecido.
LDS - Usado para carregar o registro DS e outro registro fornecido da memória
LES - Usado para carregar o registro ES e outro registro fornecido da memória.
Instruções para transferir registros de bandeira
LAHF - Usado para carregar AH com o byte baixo do registrador de flag.
SAHF - Usado para armazenar o registro AH no byte baixo do registro do flag.
PUSHF - Usado para copiar o registro do sinalizador no topo da pilha.
POPF - Usado para copiar uma palavra no topo da pilha para o registrador de bandeira.
Instruções Aritméticas
Essas instruções são usadas para realizar operações aritméticas como adição, subtração, multiplicação, divisão, etc.
A seguir está a lista de instruções deste grupo -
Instruções para realizar a adição
ADD - Usado para adicionar o byte fornecido a byte / palavra a palavra.
ADC - Usado para adicionar com transporte.
INC - Usado para incrementar o byte / palavra fornecido em 1.
AAA - Usado para ajustar ASCII após a adição.
DAA - Usado para ajustar o decimal após a operação de adição / subtração.
Instruções para realizar a subtração
SUB - Usado para subtrair o byte do byte / palavra da palavra.
SBB - Usado para realizar subtração com empréstimo.
DEC - Usado para diminuir o byte / palavra fornecida em 1.
NPG - Usado para negar cada bit do byte / palavra fornecido e adicionar o complemento de 1/2.
CMP - Usado para comparar 2 byte / palavra fornecidos.
AAS - Usado para ajustar os códigos ASCII após a subtração.
DAS - Usado para ajustar o decimal após a subtração.
Instrução para fazer multiplicação
MUL - Usado para multiplicar byte sem sinal por byte / palavra por palavra.
IMUL - Usado para multiplicar byte assinado por byte / palavra por palavra.
AAM - Usado para ajustar códigos ASCII após a multiplicação.
Instruções para realizar a divisão
DIV - Usado para dividir a palavra sem sinal por byte ou palavra dupla sem sinal por palavra.
IDIV - Usado para dividir a palavra com sinal por byte ou palavra dupla com sinal por palavra.
AAD - Usado para ajustar os códigos ASCII após a divisão.
CBW - Usado para preencher o byte superior da palavra com as cópias do bit de sinal do byte inferior.
CWD - Usado para preencher a palavra superior da palavra dupla com o bit de sinal da palavra inferior.
Instruções de manipulação de bits
Essas instruções são usadas para realizar operações onde bits de dados estão envolvidos, ou seja, operações como lógico, deslocamento, etc.
A seguir está a lista de instruções deste grupo -
Instruções para realizar operação lógica
NOT - Usado para inverter cada bit de um byte ou palavra.
AND - Usado para adicionar cada bit em um byte / palavra com o bit correspondente em outro byte / palavra.
OR - Usado para multiplicar cada bit em um byte / palavra com o bit correspondente em outro byte / palavra.
XOR - Usado para realizar a operação Exclusive-OR sobre cada bit em um byte / palavra com o bit correspondente em outro byte / palavra.
TEST - Usado para adicionar operandos para atualizar sinalizadores, sem afetar os operandos.
Instruções para realizar operações de turno
SHL/SAL - Usado para deslocar bits de um byte / palavra para a esquerda e colocar zero (S) em LSBs.
SHR - Usado para deslocar bits de um byte / palavra para a direita e colocar zero (S) em MSBs.
SAR - Usado para deslocar bits de um byte / palavra para a direita e copiar o MSB antigo para o novo MSB.
Instruções para realizar operações de rotação
ROL - Usado para girar bits de byte / palavra para a esquerda, ou seja, MSB para LSB e para Carry Flag [CF].
ROR - Usado para girar bits de byte / palavra para a direita, ou seja, LSB para MSB e para Carry Flag [CF].
RCR - Usado para girar bits de byte / palavra para a direita, ou seja, LSB para CF e CF para MSB.
RCL - Usado para girar bits de byte / palavra para a esquerda, ou seja, MSB para CF e CF para LSB.
Instruções de string
String é um grupo de bytes / palavras e sua memória é sempre alocada em uma ordem sequencial.
A seguir está a lista de instruções deste grupo -
REP - Usado para repetir a instrução dada até CX ≠ 0.
REPE/REPZ - Usado para repetir a instrução fornecida até CX = 0 ou sinalizador zero ZF = 1.
REPNE/REPNZ - Usado para repetir a instrução fornecida até CX = 0 ou sinalizador zero ZF = 1.
MOVS/MOVSB/MOVSW - Usado para mover o byte / palavra de uma string para outra.
COMS/COMPSB/COMPSW - Usado para comparar dois bytes / palavras de string.
INS/INSB/INSW - Usado como string / byte / palavra de entrada da porta de E / S para o local de memória fornecido.
OUTS/OUTSB/OUTSW - Usado como string / byte / palavra de saída do local de memória fornecido para a porta de E / S.
SCAS/SCASB/SCASW - Usado para varrer uma string e comparar seu byte com um byte em AL ou string word com uma palavra em AX.
LODS/LODSB/LODSW - Usado para armazenar o byte de string em AL ou a palavra de string em AX.
Instruções de transferência de execução do programa (instruções de ramificação e loop)
Essas instruções são usadas para transferir / ramificar as instruções durante uma execução. Inclui as seguintes instruções -
Instruções para transferir a instrução durante uma execução sem qualquer condição -
CALL - Usado para chamar um procedimento e salvar seu endereço de retorno na pilha.
RET - Usado para retornar do procedimento para o programa principal.
JMP - Usado para pular para o endereço fornecido para prosseguir para a próxima instrução.
Instruções para transferir a instrução durante uma execução com algumas condições -
JA/JNBE - Usado para pular se a instrução acima / não abaixo / igual for satisfeita.
JAE/JNB - Usado para pular se a instrução acima / abaixo for satisfatória.
JBE/JNA - Usado para pular se abaixo / igual / não acima da instrução satisfaz.
JC - Usado para pular se carry flag CF = 1
JE/JZ - Usado para pular se sinalizador igual / zero ZF = 1
JG/JNLE - Usado para pular se a instrução maior / não menor / igual for satisfeita.
JGE/JNL - Usado para pular se maior que / igual / não menor que a instrução satisfaz.
JL/JNGE - Usado para pular se a instrução for menor / não maior que / igual.
JLE/JNG - Usado para pular se for menor que / igual / se não for maior que a instrução satisfaz.
JNC - Usado para pular se não houver bandeira de transporte (CF = 0)
JNE/JNZ - Usado para pular se não for igual / zero sinalizador ZF = 0
JNO - Usado para pular se não houver sinalizador de estouro OF = 0
JNP/JPO - Usado para pular se não for paridade / paridade ímpar PF = 0
JNS - Usado para pular se não assinar SF = 0
JO - Usado para pular se o sinalizador de estouro OF = 1
JP/JPE - Usado para pular se paridade / paridade mesmo PF = 1
JS - Usado para pular se sinalizador SF = 1
Instruções de controle do processador
Essas instruções são usadas para controlar a ação do processador, definindo / redefinindo os valores do sinalizador.
A seguir estão as instruções deste grupo -
STC - Usado para definir o sinalizador de transporte CF para 1
CLC - Usado para limpar / redefinir o sinalizador de transporte CF para 0
CMC - Usado para colocar complemento no estado da bandeira de transporte CF.
STD - Usado para definir o sinalizador de direção DF para 1
CLD - Usado para limpar / redefinir o sinalizador de direção DF para 0
STI - Usado para definir o sinalizador de ativação de interrupção para 1, ou seja, ativar a entrada INTR.
CLI - Usado para limpar o sinalizador de ativação de interrupção para 0, ou seja, desativar a entrada INTR.
Instruções de controle de iteração
Essas instruções são usadas para executar as instruções fornecidas várias vezes. A seguir está a lista de instruções deste grupo -
LOOP - Usado para fazer um loop de um grupo de instruções até que a condição seja satisfeita, ou seja, CX = 0
LOOPE/LOOPZ - Usado para fazer um loop de um grupo de instruções até que satisfaça ZF = 1 & CX = 0
LOOPNE/LOOPNZ - Usado para fazer um loop de um grupo de instruções até que satisfaça ZF = 0 & CX = 0
JCXZ - Usado para pular para o endereço fornecido se CX = 0
Instruções de interrupção
Essas instruções são usadas para chamar a interrupção durante a execução do programa.
INT - Usado para interromper o programa durante a execução e chamar o serviço especificado.
INTO - Usado para interromper o programa durante a execução se OF = 1
IRET - Usado para retornar do serviço de interrupção para o programa principal