O 8086 divide-se internamente em duas unidades:
Execution Unit (EU) - Unidade de Execução:
- UAL - realiza operações aritméticas de +, -, X, / e operações lógicas AND, OR, NOT, XOR;
- contem registradores para armazenamento temporário durante as operações, que são endereçados por nome.
BUS Interface Unit (BIU) - Unidade de Interface de Barramento:
- faz a comunicação de dados entre a EU e o meio externo (memória, E/S);
- controla a transmissão de sinais de endereços, dados e controle;
- controla a seqüência de busca e execução de instruções;
- mecanismo de pre-fetch: busca até 6 instruções futuras deixando-as na fila de instruções (instruction queue) -> aumento de velocidade.
Registradores: elementos de memória muito rápida dentro da CPU.
- de dados, ou de propósito geral
- de endereços (segmentos, apontadores e índices)
- sinalizadores de estado e controle (FLAGS)
Registradores de dados:
AX e BX
- são todos registradores de 16 bits
- utilizados nas operações aritméticas e lógicas
- podem ser usados como registradores de 16 ou 8 bits
Registradores de 8 bits cada:
AH e AL
BH e BL
"H" -> byte alto ou superior
"L" -> byte baixo ou inferior
- AX (acumulador) -> utilizado como acumulador em operações aritméticas e lógicas; em instruções de E/S, ajuste decimal, conversão, etc.
- BX (base) -> usado como registrador de BASE para referenciar posições de memória. BX armazena o endereço BASE de uma tabela ou vetor de dados, a partir do qual outras posições são obtidas adicionando-se um valor de deslocamento (offset).
Registrador apontador de instrução:
IP (instruction pointer)
- utilizado em conjunto com CS para localizar a posição, dentro do segmento de código corrente, da próxima instrução a ser executada.
- IP é automaticamente incrementado em função do número de bytes da instrução executada.
Registradores apontador de pilha e de índice:
- Armazenam valores de deslocamento de endereços (offset), a fim de acessar regiões da memória muito utilizadas:
- pilha,
- blocos de dados,
- arrays e strings.
- Podem ser utilizados em operações aritméticas e lógicas, possibilitando que os valores de deslocamento sejam resultados de computações anteriores.
· SP (stack pointer - apontador de pilha) é utilizado em conjunto com SS, para acessar a área de pilha na memória; aponta para o topo da pilha.
Registrador de sinalizadores (FLAGS):
- indica o estado do microprocessador durante a execução de cada instrução;
- conjunto de bits individuais, cada qual indicando alguma propriedade;
- subdividem-se em: FLAGS da estado (status) e FLAGS de controle.
- organização:
- 1 registrador de 16 bits
- 6 FLAGS de estado
- 3 FLAGS de controle
- 7 bits não utilizados (sem função)
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF
Flags de estado:
CF - Flag de Carry
CF = 1 -> após instruções de soma que geram "vai um" após instruções de subtração que não geram "empréstimo" ("empresta um").
CF = 0 -> caso contrário.
ZF - Flag de Zero
ZF = 1 -> caso o resultado da última operação aritmética ou lógica seja igual a zero;
ZF = 0 -> caso contrário.
SF - Flag de Sinal: utilizado para indicar se o número resultado é positivo ou negativo em termos da aritmética em Complemento de 2 (se não ocorrer erro de transbordamento - overflow).
SF = 1 -> número negativo.
SF = 0 -> número positivo.
OF - Flag de Overflow (erro de transbordamento).
OF = 1 -> qualquer operação que produza overflow.
OF = 0 -> caso contrário.
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF
Os registradores do 8086 (visão geral):
Registradores de dados
Registradores índices e apontadores
Registrador de sinalizadores
FLAGS
- O registrador IP corresponde ao Contador de Programa - PC
- Todos os registradores são de 16 bits
- AH -> byte alto de AX; AL byte baixo de AX; ambos de 8 bits
Gerenciamento de memória por segmentação
O 8086 possui 20 bits para acessar posições de memória física
220 = 1.048.576 bytes (1 Mbyte) posições endereçáveis
Exemplos de endereços:
0000 0000 0000 0000 0000b -> 00000h
0000 0000 0000 0000 0001b -> 00001h
0000 0000 0000 0000 0010b -> 00002h -> 5 dígitos hexa
0000 0000 0000 0000 0011b -> 00003h
1111 1111 1111 1111 1111b -> FFFFFh
· O 8086 opera internamente com 16 bits
· Problema: Como gerar endereços com 20 bits?
· Solução: Utilizar a idéia de segmentação de memória!
Segmento de memória:
· bloco de 64 Kbytes de posições de memória consecutivas
· 216 = 65.536 bytes (64 Kbytes)
· Segmento de memória é identificado por um número de segmento
· Uma posição de memória é especificada pelo número de segmento e por um deslocamento (offset) em relação ao início do segmento.
· O identificador de segmento (base) aponta para uma região da memória.
· O offset aponta para um local dentro deste segmento.
· O offset é aquele que aparece nos programas como o endereço dos dados, rótulos e endereços de instruções.
· O identificador de segmento aparece somente quando um novo segmento precisa ser especificado.
· Segmentação é um esquema muito útil para gerar códigos relocáveis.
· A maioria das variáveis está localizada no segmento de dados, podem também estar localizadas em outros segmentos;
Interrupção:
Ocorrência eventual, durante a execução de um processamento pelo computador, que deve ser prontamente atendida, causando a suspensão do processamento em curso para o atendimento da "chamada".
Tipos de interrupções do 8086:
- Causadas pela ocorrência de eventos "catastróficos":
· falta de energia
· erro de memória
· erro de paridade em comunicações
· este tipo de interrupção não pode ser inibido.
- Causadas pela ação de dispositivos externos (periféricos):
· podem ser habilitadas ou inibidas
- Causadas pelo próprio programa em curso:
· erro de divisão
· erro de transbordamento (overflow)
· TRAP - útil para depuração de um programa
· BREAKPOINT - colocado em pontos estratégicos do programa para permitir processamento especial.
-Interrupção RESET
· permite a inicialização do microprocessador, via hardware.