<

REPRESENTAÇÃO DE INSTRUÇÕES

CONJUNTO DE INSTRUÇÕES DO MICROPROCESSADOR INTEL 8080


FORMATO GERAL DE DADOS E INSTRUÇÕES NO INTEL 8080
A memória no Microprocessador Intel 8080 é organizada em células de 8 bits (1 byte). Cada célula é identificado por um código composto por 16 bits - o endereço da célula, que geralmente é representado na base hexadecimal, acarretando um valor entre 0000 e FFFF. O 8080 pode portanto endereçar 65.536 bytes de memória, compostas de memória ROM e memória de leitura / escrita (também às vezes erroneamente chamada RAM).

Os dados são armazenados no 8080 na forma de palavras com 8 bits, como mostra a ilustração abaixo.

O bit mais à direita ou bit 0 é o bit menos significativo (em inglês, least significant bit ou LSB) e o bit mais à esquerda ou bit 7 é o bit mais significativo (em inglês, most significant bit ou MSB).

As instruções no Intel 8080 podem ter 1, 2 ou bytes, ocupando respectivamente uma, duas ou tres células de memória. As ilustrações a seguir apresentam as instruções de 1, 2 e 3 bytes.
As instruções de 1 byte não tem operando.

As instruções de 2 bytes tem como operando um dado de 8 bits.

As instruções de 3 bytes tem como operando um endereço ou um dado de 16 bits.

Em uma instrução de 3 bytes em que o operando é um endereço, o endereço é armazenado sempre com o byte menos significativo na posição seguinte à do opcode e o byte mais significativo do endereço no 2º byte após o opcode. São ocupadas 3 células consecutivas da Memória Principal do Intel 8080, como mostra a ilustração seguinte:

IDENTIFICAÇÃO DO MODO DE ENDEREÇAMENTO DA INSTRUÇÃO


No Intel 8080, o Código de Operação identifica o modo de endereçamento, através de seu mnemônico e do correspondente código binário.

Os registradores envolvidos em instruções que usam os modos de endereçamento direto por registrador e indireto por registrador são definidos através de determinados bits no opcode.

MODOS DE ENDEREÇAMENTO


O Intel 8080 dispõe dos seguintes modos de endereçamento:
Implícito
Imediato
Direto
Registrador Direto
Registrador Indireto

MODO IMPLÍCITO (Implied Addressing)


A função da instrução traz implícito o endereçamento. Não há operando.

Exemplo
No microprocessador Intel 8080 essas instruções ocupam apenas 1 byte, sendo buscadas em apenas 1 acesso à memória. São as seguintes as instruções com endereçamento implícito:
STC (set carry flag) - "seta" o bit de carry e CMC (complement carry) - complementa o valor do bit de carry; - o operando implícito é o carry flaag.
RAL (rotate accumulator left), RAR (rotate accumulator right) - instruções de deslocamento de bits, à esquerda e à direita - o operando implícito é o acumulador;
RLC (rotate accumulator left through carry) e RRC (rotate accumulator right through carry) - instruções de deslocamento de bits, à esquerda e à direita, através do carry flag - os operandos implícitos são o acumulador e o carry flag;
DAA (decimal adjust accumulator) - instrução para aritmética em BCD - o ooperando implícito é o acumulador (usa também o flag AC - auxiliary carry).

MODO IMEDIATO


O valor do campo operando é o próprio dado.

É usado para trabalhar com valores constantes. O operando é dito operando imediato (o operando é o próprio valor a ser operado, ou seja, é o próprio dado a ser processado).

Vantagem
O operando é obtido durante o ciclo de busca, em apenas 1 acesso (quando o operando é de apenas 1 byte, tal como um dado de 8 bits) ou em 2 acessos (quando o operando é de 2 bytes, tal como um dado de 16 bits ou um endereço). Não é necessário fazer nenhum acesso à MP no ciclo de execução, o que acarreta maior rapidez na execução.
Obs.: Algumas instruções no modo imediato (geralmente instruções que manipulam endereços de memória) buscam endereços ou dados de 2 bytes. Ver exemplos com as instruções JMI Op e LXI Op.

Desvantagens
a) O tamanho do dado fica limitado ao número de bits do operando (campo operando da instrução). A limitação de tamanho do campo operando reduz o valor máximo do dado que pode ser armazenado. No Intel 8080, o campo Operando tem 8 bits, portanto o maior valor deste campo será limitado a 28 = 256. Existem instruções que permitem carregar doublewords, isto é, palavras duplas que ocupam 2 células de memória, em que o maior valor será limitado a 216 = 65.536 (64k).
b) Este modo de endereçamento não permite flexibilidade para alterar dados que variam a cada execução do programa, portanto não é adequado para variáveis repetidamente operadas com diferentes valores a cada execução do programa.

Utilização
- Inicialização de contadores
- Constantes
- Armazenamento de ponteiros em registradores
- Indicação de quantidade de posições em operações de deslocamento de bits (multiplicação e divisão)

Exemplo de instruções no Modo Imediato
Exemplo 1 - Instrução ADI

ADI data ==> ACC <--- ACC + Op
Soma o valor (hexadecimal) contido no operando ao acumulador e coloca o resultado no acumulador.
Valor (hexadecimal) do código da operação: C6
Nº de Bytes ocupados pela instrução: 2 bytes
Ciclos de acesso da instrução: 2 (leitura)

Descrição Acesso Ciclo
Busca do Opcode Leitura Busca
Busca do Operando Leitura Busca

Endereçamento: imediato
Flags setados: Z, S, P, CY, AC

Ex.: Considerando o acumulador contendo inicialmente o valor 7AH, qual será o valor do acumulador após a execução da instrução
ADI dado (add immediate) ==> ACC <--- ACC + Op (soma o valor hexadecimal do operando ao acumulador)

Exemplo 2 - Instrução JMP
JMP endereço (jump) ==> PC <--- Op =>
Carrega o endereço (contido nos bytes 2 e 3 da instrução) no PC
Equivale a transferir o controle do programa para a instrução que inicia no endereço especificado pelo operando.
Valor (hexadecimal) do código da operação: C3
Nº de Bytes ocupados pela instrução: 3 bytes
Ciclos de acesso da instrução: 3 (leitura)

Descrição Acesso Ciclo
Busca do Opcode Leitura Busca
Busca do 1º byte do Operando Leitura Busca
Busca do 2º byte do Operando Leitura Busca

Endereçamento: imediato
Flags setados: nenhum

Obs.Importante: O Intel 8080 armazena o byte menos significativo do operando na posição de memória que segue o opcode e o byte mais significativo do operando na segunda posição de memória que segue o opcode.

JMP 1000H ==> CI<--- 1000H ==> causa um desvio para o endereço 1000 (hexadecimal)

Exemplo 3 - Instrução de Desvio Conditional
Jcondition endereço ("conditional jump") ==> if CCC, PC <--- endereço
Se a condição estabelecida for satisfeita, copia o operando (bytes 2 e 3 da instrução) para o PC. Equivale (se a condição estabelecida for satisfeita) a transferir o controle do programa para a instrução que inicia no endereço especificado pelo operando.

Valor (hexadecimal) do código da operação: depende da condição (ver formato da instrução na ilustração)
Nº de Bytes ocupados pela instrução: 3 bytes
Ciclos de acesso da instrução: 3 (leitura)

Descrição Acesso Ciclo
Busca do Opcode Leitura Busca
Busca do 1º byte do Operando Leitura Busca
Busca do 2º byte do Operando Leitura Busca

Endereçamento: imediato
Flags setados: nenhum.

Obs.: Os códigos de condição são:

CONDIÇÃO CÓDIGO
NZ - não zero (Z=0) 000
Z - zero (Z=1) 001
NC - não carry (C=0) 010
C - carry (C=1) 011
PO - paridade par (P=0) 100
PE - paridade ímpar (P=1) 101
P - positivo (P=0) 110
M - negativo (P=1) 111

Examplo 4 - Instrução Move Imediato
MVI R, dado (move immediate) ==> R <--- Op
Move o valor do operando para o registrador R
Valor (hexadecimal) do código da operação: depende do registrador (ver formato da instrução na ilustração)
Nº de Bytes ocupados pela instrução: 2 bytes
Ciclos de acesso da instrução: 2 (leitura)

Descrição Acesso Ciclo
Busca do Opcode Leitura Busca
Busca do Operando Leitura Busca

Endereçamento: imediato
Flags setados: nenhum

MVI C, C1H ==> C <--- C1H

Exemplo 4 - Instrução LXI
LXI data16 (load register pair immediate) ==> RP <--- Op
Carrega o valor do operando (dois bytes) em um par de registradores, sendo que o byte 3 é carregado em Rhigh (byte mais significativo do par de registradores de destino) e o byte 2 é carregado em Rlow (byte menos significativo).
Valor (hexadecimal) do código da operação: depende do registrador (ver formato da instrução na ilustração)
Nº de Bytes ocupados pela instrução: 3 bytes
Ciclos de acesso da instrução: 3 (leitura).

Descrição Acesso Ciclo
Busca do Opcode Leitura Busca
Busca do 1º byte do Operando Leitura Busca
Busca do 2º byte do Operando Leitura Busca

Endereçamento: imediato
Flags setados: nenhum

LXI M, 31FFH ==> M <--- 31FF (carrega o valor hexadecimal 31FF no Par de Registradores HL)

Nota: No Intel 8080, as instruções com endereçamento imediato são quase sempre codificadas com mnemônicos de 3 letras terminados pela letra I.
Exemplos
instrução de soma ==> mnemônico para endereçamento direto = ADD
instrução de soma ==> mnemônico para endereçamento imediato = ADI;

instrução “move” ==> mnemônico para endereçamento direto = MOV
instrução “move” ==> mnemônico para endereçamento imediato = MVI;

instrução “load” (carrega) ==> mnemônico para endereçamento direto): LDA
instrução “load” ==> mnemônico para endereçamento direto = LDI

Obs.: No Intel 8080, quase todas as instruções imediatas usam o acumulador como operador implícito. As exceções são:
MVI (move immediate) - pode mover o dado para qualquer registrador de trabalho ou posição de memória;
LXI (load register pair immediate) - move um dado de 16 bits (geralmente um endereço) para qualquer par de registradores.

MODO DIRETO


O valor do campo operando indica o endereço do dado na MP.
No Intel 8080, como um endereço requer 16 bits, o operando (no modo direto) terá 16 bits, ocupando 2 células e as instruções no modo de endereçamento direto terão 3 bytes.

Vantagens
a) É aplicado em mais situações que o modo imediato;
b) Requer apenas uma referência à memória para busca do dado (além de uma para a busca da instrução), sendo mais rápido que o modo indireto.

Desvantagens
a) Limitação do endereço da MP que pode ser indicado pelo tamanho do campo operando.
b) É mais lento que o modo imediato.

Utillização
Quando o dado varia de valor a cada execução.

Exemplos de Instruções no Modo Direto:
Exemplo 1 - Instrução LDA
LDA endereço (”load accumulator direct”) ==> ACC <--- (Op)
Carrega o conteúdo da posição de memória indicada pelo operando (bytes 2 e 3 da instrução) no acumulador (o operando indica um endereço na memória).
Valor (hexadecimal) do código da operação: 3A
Nº de Bytes ocupados pela instrução: 3 bytes
Ciclos de acesso da instrução: 4 (leitura)

Descrição Acesso Ciclo
Busca do Opcode Leitura Busca
Busca do 1º byte do Operando Leitura Busca
Busca do 2º byte do Operando Leitura Busca
Busca do Dado Leitura Execução

Endereçamento: direto
Flags setados: nenhum

LDA 978A ===> ACC <--- (978A) = carrega no acumulador o conteúdo da posição de memória 978A (ver ilustração abaixo).

Exemplo 2 - Instrução LHLD

LHLD endereço ==> (load H and L direct) L <--- (Op)
H <--- (Op + 1)

O conteúdo da posição de memória indicada pelo operando é carregado no registrador L; o conteúdo da posição de memória seguinte à indicada pelo operando é carregado no registrador H.

Valor (hexadecimal) do código da operação: 2A
Nº de Bytes ocupados pela instrução: 3 bytes
Ciclos de acesso da instrução: 5 (leitura)

Descrição Acesso Ciclo
Busca do Opcode Leitura Busca
Busca do 1º byte do Operando Leitura Busca
Busca do 2º byte do Operando Leitura Busca
Busca do 1º byte do dado (endereço) Leitura Execução
Busca do 2º byte do dado (endereço) Leitura Execução

Endereçamento: direto
Flags setados: nenhum

LHLD 1000H ==> L <--- (1000H) e H <--- (1001H) ===> carrega o conteúdo das posições 1000H e 1001H no par HL (ver ilustração abaixo).

Exemplo 3 - Instrução SHLD

SHLD endereço ==> (store H and L direct) (Op) <--- L
(Op + 1) <--- H

Valor (hexadecimal) do código da operação: 22
Nº de Bytes ocupados pela instrução: 3 bytes
Ciclos de acesso da instrução: 5, sendo 3 (leitura) e 2 (escrita)

Descrição Acesso Ciclo
Busca do Opcode Leitura Busca
Busca do 1º byte do Operando Leitura Busca
Busca do 2º byte do Operando Leitura Busca
Grava o 1º byte do dado no endereço Escrita Execução
Grava o 2º byte do dado no endereço Escrita Execução

Endereçamento: direto
Flags setados: nenhum

SHLD 7AC1H ==> (7AC1) <--- L e (7AC2) <--- H ===> move o conteúdo do Registrador L para a posição de memória indicada pelo operando e o conteúdo do Registrador H para a posição de memória seguinte - (ver ilustração abaixo). 

Exercício:
Comparar o efeito das instruções acima no modo direto com as instruções equivalentes no modo imediato, em termos do número de acessos à memória.

Resp: No modo de endereçamento direto, são necessários mais de 1 acessos à MP para a busca do dado, sendo 1 no ciclo de busca para busca do operando e pelo menos 1 no ciclo de execução para a busca do dado propriamente dito. No modo imediato, é necessário apenas um acesso à memória no ciclo de busca para a busca do dado (o operando é o próprio dado). Não é necessário nenhum acesso de busca à memória no ciclo de execução.

MODO INDIRETO


O campo operando contém um endereço de memória cujo conteúdo é o endereço do dado a ser operado.
Portanto, há um duplo endereçamento. O endereço intermediário é chamado ponteiro (“pointer”)
O Intel 8080 somente dispõe de instruções com modo de endereçamento indireto usando registradores como ponteiro. Os exemplos dessa aplicação são apresentados no item sobre ENDEREÇAMENTO POR REGISTRADOR.

ENDEREÇAMENTO POR REGISTRADOR


Existem outros modos de endereçamento, que usam registradores para indicar a posição onde estão os dados. Os modos de endereçamento direto e indireto por registrador funcionam de forma semelhante aos modos de endereçamento direto e indireto vistos anteriormente (em que o operando aponta para uma posição de memória), porém utilizando um registrador em lugar do operando. O conteúdo do Registrador pode ser o dado - endereçamento direto - ou então é uma referência à memória - endereçamento indireto.

MODO POR REGISTRADOR (Modo por registrador direto)
O operando aponta para um registrador, o qual contém o dado.

MODO POR REGISTRADOR INDIRETO
O operando aponta para um registrador, o qual contém um endereço de memória (ponteiro) onde está o dado.

Vantagens
Maior velocidade / rapidez de execução - o acesso ao registrador é muito mais rápido que o acesso à memória.
Economia de espaço de armazenamento de instrução (o tamanho da instrução é menor porque como são poucos registradores, são menos bits para seus endereços).

Desvantagem
Não são adequados para transferência de variáveis da MP para ULA.
Pequeno número de registradores - se forem muitos os dados endereçados por registrador, os registradores disponíveis podem não ser suficientes.

Utilização
Implementação de contadores.

No Intel 8080, a identificação do registrador envolvido na operação faz parte do próprio opcode.

Identificação dos Registradores no Código de Operação
Obs.: SSS representa o "Registrador de Origem" e DDD o "Registrador de Destino"; RP representa "Par de Registradores".

SSS ou DDD Valor RP Valor
ACC (ou A) 111 - -
B 000 B 00
C 001 - -
D 010 D 01
E 011 - -
H 100 H (ou M) 10
L 101 - -
- - SP 11

Exemplos
Exemplos de Instruções no Modo por Registrador Direto
Obs.: A documentação Intel denomina este modo como "Modo Registrador".
Exemplo 1 - Instrução ADD r
ADD r ("add register") ==> ACC <--- ACC + R -
Soma o valor contido no registrador R ao valor contido no acumulador.
Valor (hexadecimal) do código da operação: depende do Registrador

Nº de Bytes ocupados pela instrução: 1 byte
Ciclos de acesso da instrução: 1 (leitura)

Descrição Acesso Ciclo
Busca do Opcode Leitura Busca

Endereçamento: registrador direto
Flags setados: Z, S, P, CY, AC

Exemplo 2 - Instrução DCR R
DCR r ("decrement register") ==> R <--- R - 1 -
Decrementa o conteúdo do registrador R.
Valor (hexadecimal) do código da operação: depende do Registrador

Nº de Bytes ocupados pela instrução: 1 byte
Ciclos de acesso da instrução: 1 (leitura)

Descrição Acesso Ciclo
Busca do Opcode Leitura Busca

Endereçamento: registrador direto
Flags setados: Z, S, P, AC (CY não é afetado)

Exemplo 3 - Instrução MOV R1, R2
MOV r1, r2 ("move register") ==> r1 <--- r2
O conteúdo do registrador r2 é copiado para o registrador r1 .
Valor (hexadecimal) do código da operação: depende dos Registradores envolvidos

Nº de Bytes ocupados pela instrução: 1 byte
Ciclos de acesso da instrução: 1 (leitura)

Descrição Acesso Ciclo
Busca do Opcode Leitura Busca

Endereçamento: registrador direto
Flags setados: nenhum.

Exemplos de Instruções no Modo por Registrador Indireto
Obs.: A documentação Intel denomina este modo como "Modo Registrador Indireto".
Exemplo 1 - Instrução ADD M
ADD M ("add memory") ==> ACC <--- ACC + (HL) -
Soma o valor contido no endereço referenciado pelo par de registradores HL ao valor contido no acumulador.
Valor (hexadecimal) do código da operação: 86
Nº de Bytes ocupados pela instrução: 1 byte
Ciclos de acesso da instrução: 2 (leitura)

Descrição Acesso Ciclo
Busca do Opcode Leitura Busca
Busca o dado no endereço (HL) Leitura Execução

Endereçamento: por registrador, indireto
Flags setados: Z, S, P, CY, AC

Exemplo 2 Instrução INR M
INR M (increment memory) ==> (HL) <--- (HL) + 1
Incrementa o conteúdo da posição de memória indicada pelo par de registradores HL
Valor (hexadecimal) do código da operação: 34
Nº de Bytes ocupados pela instrução: 1 byte
Ciclos de acesso da instrução: 3 (sendo 2 de leitura e 1 de escrita)

Descrição Acesso Ciclo
Busca do Opcode Leitura Busca
Busca o dado no endereço (HL) Leitura Execução
Grava o resultado - dado + 1 - em (HL) Escrita Execução

Endereçamento: por registrador, indireto
Flags setados: Z, S, P, AC (CY não é afetado)

Exemplo 3 Instrução MOV M, R
MOV M, r (move to memory) ==> (HL) <--- r
O conteúdo do registrador r é copiado para a posição de memória cujo endereço está no registrador M
Valor (hexadecimal) do código da operação: depende do registrador envolvido

Nº de Bytes ocupados pela instrução: 1 byte
Ciclos de acesso da instrução: 2 (sendo 1 de leitura e 1 de escrita)

Descrição Acesso Ciclo
Busca do Opcode Leitura Busca
Grava o dado no endereço (HL) Escrita Execução

Endereçamento: por registrador, indireto
Flags setados: nenhum

MODO INDEXADO E MODO BASE + DESLOCAMENTO


O Intel 8080 não possui nenhuma instrução com esses modos de endereçamento, os quais somente foram introduzidos na família Intel a partir do 8086.

Os microprocessadores Intel (após 8086/8) usam registradores específicos como registradores-base. Estes Registradores de Base são utilizados para implementar o endereçamento de memória e a segmentação da memória em páginas de 64 kbytes.

COMBINAÇÃO DE MODOS DE ENDEREÇAMENTO


Algumas instruções usam uma combinação de modos de endereçamento.
Por exemplo, a instrução CALL usa uma combinação do endereçamento direto (ou imediato) com endereçamento por registrador indireto.
endereçamento direto - especifica o endereço da sub-rotina desejada
endereçamento por registrador indireto - é o Ponteiro da Pilha

Exemplos de Instruções com combinação de Modos de Endereçamento
Exemplo - Instrução CALL endereço
CALL endereço ==>
(SP - 1) <--- PCH ==> o valor contido no byte de mais alta ordem do Program Counter (modo de endereçamento: registrador direto) é transferido para o endereço de memória igual ao valor contido no Ponteiro de Pilha (Registrador SP) menos 1 (modo de endereçamento: registrador indireto)
(SP - 2) <--- PCL ==> o valor contido no byte de mais baixa ordem do Program Counter (modo de endereçamento: registrador direto) é transferido para o endereço de memória igual ao valor contido no Ponteiro de Pilha (Registrador SP) menos 2 (modo de endereçamento: registrador indireto) ;
SP <--- SP - 2 ==> o valor contido no Registrador SP é decrementado de 2 unidades (modo de endereçamento: implícito/imediato);
PC <--- endereço ==> o valor do operando (bytes 2 e 3 da instrução) (modo de endereçamento: imediato) é transferido para o Program Counter (modo de endereçamento: registrador direto).

A instrução CALL copia (“push”) o conteúdo corrente do CI para a posição da MP especificada pelo ponteiro da pilha (Stack Pointer) e transfere o controle do programa para a instrução cujo código de operação está armazenado na posição de memória apontada pelo operando.

Valor (hexadecimal) do código da operação: CD
Nº de Bytes ocupados pela instrução: 3 bytes
Ciclos de acesso da instrução: 5 (sendo 3 de leitura e 2 de escrita)
A instrução CALL requer 5 acessos à memória, sendo 3 para buscar a instrução (opcode mais operando de 2 bytes) e mais 2 para salvar ("push") o conteúdo (2 bytes) do PC (Program Counter) para o ponteiro da pilha (Stack Pointer).

Descrição Acesso Ciclo
Busca do Opcode Leitura Busca
Busca do 1º byte do Operando Leitura Busca
Busca do 2º byte do Operando Leitura Busca
Grava o byte de menor ordem do endereço da próxima instrução (contido no PCL) no endereço indicado por SP - 1 Escrita Execução
Grava o byte de maior ordem do endereço da próxima instrução (contido no PCH) no endereço indicado por SP - 2 Escrita Execução

Modos de Endereçamento: implícito / imediato / registrador direto / registrador indireto
Flags setados: nenhum

Ver páginas sobre Pilha e Processamento de Sub-rotinas

EFEITOS DE TEMPORIZAÇÃO DOS MODOS DE ENDEREÇAMENTO


O número de acessos à memória é o mais importante fator no consumo de tempo de execução da instrução. O modo de endereçamento afeta o tempo requerido para executar uma instrução e a memória requerida para seu armazenamento

Instruções que usam endereçamento implícito ou por registrador direto são executadas muito rápido, pois trabalham diretamente com o hardware do processador e seus registradores. No Intel 8080, uma instrução no modo de endereçamento implícito ou por registrador direto toda pode ser buscada (“fetched”) em um único ciclo de busca (um único acesso à memória), correspondente à busca do opcode.

Cada ciclo de acesso à memória busca uma célula e implica em um número variável de estados, cujo tempo de duração depende da frequência do clock. Cada instrução consome um determinado número de ciclos de UCP.

Operações de Entrada e Saída no Intel 8080
Este item será elaborado posteriormente.