Você está na página 1de 17

Trabalho 1 de Microprocessadores – Processador 8086

Alunos: Eric Kieling, Marcos Hermes, Marcelo Tocchetto, Ricardo Rosa e Tiago Duarte.

Primeira geração
A primeira geração de processadores foi usada no primeiro IBM PC e seus clones. Esses
processadores são muito primitivos comparados com processadores atuais. Nesta geração, os
processadores funcionam na mesma velocidade do barramento do sistema.
O primeiro chip usado nos PCs foi o Intel 8088, esse não era o melhor processador
disponível na época, pois o 8086 era mais potente. Porem o 8088 foi escolhido por razões
econômicas: o barramento de 8 bits necessitava de placas mães mais baratas que o barramento de 16
bits do 8086.
O processador 8086 foi lançado pela Intel em Junho de 1978, depois de ser desenvolvido
por uma equipe liderada por Bill Pohlman. O 8086 foi o primeiro processador da linha x86 que é
composta por processadores 80186, 80286, 80386, 80486, Pentium até o ultimo Pentium IV.
Existem 3 tipos de 8086, variando a freqüência entre 4.77, 8 e 10MHz. Ele possui um
conjunto de instruções de aproximadamente 300 operações. Ele possui um barramento de endereços
de 20 bits, podendo endereçar até 1 Mb de memória. Não possui pipeline e não possui memória
cache níveis 1 ou 2. Era um processador simples, com apenas 29.000 transistores e com co-
processador matemático externo.

Segunda geração
Lançado em fevereiro de 1982, o 80286 foi o único processador considerado da segunda
geração. A Intel criou um processador entre o 8088 e o 80286, chamado de 80186. Mas devido à
falta de desempenho comparado com o 80286 e alguns problemas de compatibilidade, o 80186
nunca foi utilizados em PCs. Entretanto foi bastante utilizado em sistemas embarcados.
O 286 foi a primeira grande evolução nos processadores dos PCs, com uma aumento
significativo de desempenho em relação ao seu antecessor. Ele possuía o dobro de performance com
o mesmo clock que o 8086.
O 286 aumentou o barramento de memória para 24 bits, acessando até 16 Mb de memória e
introduziu o modo protegido. Inicialmente foi disponibilizado em 6 e 8 MHz, mas depois foi
expandido para versões de até 20 MHz. Ainda era um processador simples, com apenas 134.000
transistores e com co-processador matemático externo.

Terceira geração
Em outubro de 1985, a Intel lançou o 80386DX, que foi o primeiro processador de 32 bits
utilizado em PCs. O tamanho dos registradores foram aumentados para 32 bits, assim como o
barramento de dados e endereços, aumentando o endereçamento de memórias até 4 GB em teoria.
O conjunto de instruções no 386 foi definido como padrão para o que agora é chamado de
x86 e não mudou muito desde sua introdução. O 80386DX foi o primeiro processador dos PCs a
utilizar pipelines para permitir um aumento muito maior na performance.
O 80386 possui 275.000 transistores. Existem versões de 16, 20, 25, 33 e 40 MHz. O
pipeline possui 4 estágios sem preditor de saltos. Ele funciona em modo real, protegido e virtual.
A Intel lançou uma versão light do 80386DX, ele era o 80386SX. A única diferença era o
barramento de dados e de memória, que foi reduzido para 16 bits. Ele podia endereçar apenas 24
mb de memória e era 20-25% mais lento do que o modelo DX.

Quarta geração
Lançado em abril de 1989, o Intel 80486DX foi o primeiro membro da quarta geração. Ele
possui um aumento de desempenho muito significativo em relação ao 80386DX. Ele é
aproximadamente 100 a 150% mais rápido do que um 386DX com o mesmo clock.
O 486 não proveu o aumento de performance aumentando o barramento como foi o caso da
terceira geração. Ele ainda era um processador de 32 bits com barramento de dados e
endereçamento de 32 bits. Entretanto, internamente o 486 possuía varias melhoria em relação ao
386:
* Pipeline mais profundo: com 5 estágios ao invés de 4
* Cache primaria: O 486 foi o primeiro processador a incorporar a cache de nível 1 no chip, para
reduzir o numero de acessos à memória.
* Unidade de pondo flutuante (FPU) integrada: O processador possuía um co-processador
matemático integrado no chip.
* Burst Mode: O 486 introduziu o burst mode para reduzir o tempo de espera nos acessos à
memória.
* Melhorias na arquitetura da placa mãe: As placas mães do 486 eram mais eficientes do que as do
386, e começaram a utilizar cache de nível 2.
O numero de transistores cresceu de 275.00 no 386 para 1.2 milhões no 486.

Quinta geração
O processador da Intel de quinta geração deveria ser chamado de 586, porem a Intel queria
registrar a marca e números não podem ser registrados. Assim, em março de 1993 surgiu o Pentium,
que através de varias melhorias na arquitetura possuía um desempenho duas vezes maior do que um
486 com o mesmo clock. Algumas melhorias em relação ao 486 são:
* Arquitetura Superscalar: O Pentium foi o primeiro processador superscapar, usando duas unidades
de execução em paralelo. Na verdade ele era parcialmente superscalar, pois a segunda unidade de
execução só conseguia executar algumas instruções. Para aproveitar ao máximo, era necessário
otimizar o código para o Pentium.
* Barramento de dados mais largo: O barramento de dados do Pentium dobrou para 64 bits
* Barramento mais rápido: O barramento do Pentium era 66 MHz, enquanto que o dos 486s eram
33 MHz.
* Predição de Saltos: O Pentium foi o primeiro a ter um preditor de saltos. Ele possuía 80% de
acertos.
* Melhora da unidade de pondo flutuante: A unidade de ponto flutuante do Pentium é muito mais
rápida do que a do 486.
O Pentium ficou famoso por possuir um bug na unidade de ponto flutuante. Esse bug ficou
conhecido como "FDIV bug". Pois ele resultava valores incorretos ao se executar a instrução FDIV.
O Pentium possuía 3.1 milhões de transistores enquanto o seu antecessor possuía apenas 1.2
milhões.
Arquitetura do Microprocessador 8086 / 8088

Características Gerais
O 8086 é um dos mais antigos e conhecidos microprocessadores de 16 bits. Sua
popularidade se deve a ter sido escolhido como processador para a linha de computadores pessoais
da IBM. Na verdade, o IBM-PC tradicional usa uma versão simplificada do 8086, o 8088. Novos
membros da família IBM-PC (como o PC AT e o PS/2) usam extensões (versões melhoradas e
parcialmente compatíveis) do 8086.
Fisicamente, o 8086 tem 20 linhas para endereçamento. O endereçamento é feito a bytes.
Interna e externamente, o 8086 tem barramentos de dados de 16 bits (o 8088 apresenta barramento
externo de dados de apenas 8 bits). Para aumentar a velocidade de processamento, o 8086 opera
sobre uma fila de instruções pré-carregadas (fetch look ahead). Todos os registradores de dados
e/ou endereços são de 16 bits.
Todo endereço de palavra tem que ser par (bit menos significativo em zero). Palavras são
armazenadas com o byte menos significativo neste endereço e com o byte mais significativo no
endereço ímpar seguinte.

Componentes Básicos

Execution Unit – EU
- Executa instruções
- Atualiza flags
- Opera em 16 bits
- O acesso aos dados é feito via BIU (não se comunica diretamente com o meio externo)
Bus Interface Unit – BIU
- Executa o gerenciamento dos barramentos de dados e instruções
- Executa pre-fetch (busca antecipada de instruções)
Diagrama de Blocos do 8086
A operação independente e paralela da EU e BIU permitem um pre-fetch e, portanto, um
aumento de desempenho. A otimização do tempo de execução acelera programas sem muitos
desvios e com pequenos laços (6 bytes).
Este artifício caracteriza um pipeline de execução composto de dois estágios, onde o ciclo de
instrução é composto de ciclo de busca (BIU) e ciclo de execução (EU).

Diferenças entre o 8086 e o 8088


A arquitetura de ambos os microprocessadores é idêntica, mudam apenas alguns ítens ao
nível de organização. O 8088 possui barramento externo de dados de 8 bits enquanto que no 8086,
este barramento é de 16 bits. Devido a este fator, o 8088 faz dois acessos à memória para ler um
dado. No 8088, a pinagem é diferente e a fila de instruções, mantida pela BIU, possui apenas 4
entradas, i.e., pode adiantar a busca de apenas 4 instruções.

Registradores
A arquitetura da família 8086 apresenta 8 registradores de uso geral (divididos em 4
registradores de dados e 4 de endereços), 4 registradores de segmento, 1 apontador de instruções
(IP) e 1 registrador de flags.
Registradores de Dados
Os quatro registradores de dados são denominados de A, B, C e D. Estes registradores são
denominados de AX, BX, CX e DX quando usados como registradores de 16 bits. Quando
utilizados em 8 bits, recebem os sufixos H (high) e L (low) para indicar a posição do byte dentro da
palavra. Tem-se então os pares AH:AL, BH:BL, CH:CL e DH:DL quando usados como
registradores de 8 bits.

Registradores de Endereço
Os registradores de endereço normalmente acessam operandos na memória. Os registradores
SP e BP são usados para operações na pilha. Os nomes de SI e DI para os registradores de índice
derivam da sua utilização nas instruções de manipulação de string. SI e DI, apesar disso, podem
também ser utilizados para acessar operandos em algumas instruções.

Flags
O registrador de flags fornece indicação dos códigos de condição da unidade aritmética e
lógica e do estado do processador.

Tabela: Flags de Status do 8088/8086


CF Bit 0 vai-um (carry)
PF Bit 2 paridade (parity)
AF Bit 4 vai-um (auxiliary
auxiliar carry)
ZF Bit 6 zero
SF Bit 7 sinal (signal)
OF Bit 11 overflow

Tabela: Flags de Controle do 8088/8086


TF Bit 8 trap
IF Bit 9 interrupt
enable
DF Bit direção (direction)
10

Registradores de Segmento
Os registradores de segmento armazenam os 16 bits mais significativos do endereço de 20
bits (real). Assim, o endereço base de um segmento é sempre múltiplo de 16 (ou seja, tem os quatro
bits menos significativos implicitamente em zero).
Para acessar um byte ou palavra particular na memória, é necessário um offset , ou seja, uma
distância em bytes do início do segmento. O endereço real de memória de 20 bits é o resultado da
soma de um registrador de segmento (deslocado de 4 bits para a esquerda) e um offset de 16 bits
(seção 4.5.1). O registrador de segmento e a fonte do offset dependem do tipo de referência à
memória desejado:
Tabela: Tipos de Referência à Memória

tipo de referência a segmento segmento offset


memória default alternativo
busca de instrução CS nenhum IP
pilha SS nenhum SP
variável DS CS, ES, SS endereço efetivo
string fonte DS CS, ES, SS SI
string destino ES nenhum DI
BP como registrador base SS CS, ES, DS endereço efetivo

O endereço efetivo mencionado na tabela corresponde ao resultado da avaliação de um


modo de endereçamento. Nos casos em que um segmento alternativo aparece na tabela, o segmento
default pode ser substituído usando-se um prefixo de segmento.
A referência a uma posição de memória é dada por:
reg_segmento : reg_offset
Por exemplo: CS:IP, SS:SP, DS:SI, DS:DI
Pinagem

A figura abaixo ilustra a pinagem do Microprocessador 8086. Em uma breve comparação


não existe diferença virtual entre os dois microprocessadores: ambos são encapsulados em DIPs de
40 pinos .
O 8086 é um microprocessador de 16 bits com barramento de dados 16 bits, já o 8088 é de
16 bits com barramentos de dados de 8 bits. O barramento de dados é a maior diferença entre os
dois.
A única outra diferença de hardware aparece no pino 34 dos dois chips, é o pino /SSO no
8088 e pino /BE-S no 8086. Nosso foco mantém-se no 8086.

Funções dos Pinos do 8086


3 - AD15-AD0: Barramento de dados e endereços: as linhas que compõe o endereço do
barramento de dados do 8086 e contém informações ou números de portas do I/O durante ALE(1)
ou dados quando ALE é inativo. Estes pinos estarão em alta impedância enquanto durar o estado de
reconhecimento de retenção.
4 - A19/S6, A18/S5, A17/S4 E A16/S3 - Endereçamento e Status: Pinos multiplexados que
contém os bits do barramento de endereços A19-A16 durante o ALE e para o ciclo de barramento
remanescente, contém os bits de status. Estes pinos estarão em alta impedância enquanto durar o
estado de reconhecimento de modo espera.
5 - /RD - Leitura
6 - READY - Pronto
7 - INTR - Requisição de Interrupção
8 - /TEST- Pino de teste
9 - NMI - Interrupção não mascarada
10 - RESET - Pino de Reset
11 - CLK - Clock
12 - Vcc
13 - GND - Terra
14 - MN_/MX - modo mínimo_/máximo
15 - /BHE_S - Barramentos Altos Habilitados/Status

Pinos no Modo Mínimo


A operação em modo mínimo do 8088/8086 é obtida conectando o pino MN|/MX
diretamente em 5V.
1- I/O|/M (8088) e /I/O|M (8086) - Memória ou Input/Output
2 - /WR - Modo escrita
3 - /INTA - Reconhecimento de interrupção
4 - ALE - Latch de endereçamento habilitado
5- DT|/R - Transmissão ou recepção de dados
6 - /DEN - Barramento de dados habilitado
7 - HOLD - Entrada utilizada para requisitar DMA
8 - HLDA - Reconhecimento de espera

Pinos no modo máximo


Ativando a operação em modo máximo pode-se utilizar um co-processador externo
1 - /S2, /S1 e /S0 – Status - Bits utilizados em modo máximo para gerar sinais de controle do
sistema principal através do controlador de barramento 8288.
2 - /RQ|/GT0 e /RQ|/GT1- Pedido | Concessão - pinos utilizados para requisitar controle de
barramento por co-processador externo. Cada uma das linhas é uma conexão bi-direcional que
permite ao co-processador.
3 - /LOCK - Travamento
4 - QS1 e QS0 - Status da fila
Assembly do x86
Registradores
Registradores genéricos: %eax, %ebx, %ecx, %edx, %edi, %esi
Registradores específicos: %ebp, %esp, %eip %eflags

Até mesmo os registradores de uso genérico possuem algumas funções especificas em determinadas
instruções. Por exemplo, a instrução idivl requer que o dividendo esteja em %eax e %edx seja zero
e o quociente ficará em %eax e o resto em %edx, mas o divisor pode ser qualquer registrador ou
endereço de memória.
Não é possível acessar diretamente o %eip e o %eflags. %eip é modificado sempre que utilizarmos
uma instrução de salto ou chamada de subrotina. %eflags é modificado depois de alguma operação
lógica ou aritmética.
Nas instruções que possuem dois operandos, o primeiro é a origem e o segundo é o destino. Neste
caso, o operador de origem não é modificado pela instrução.
Os primeiros processadores x86 (8068, 80286) possuíam registradores de 16 bits e eram acessados
como %ax, %bx, %cx, etc. A partir do 386 os registradores se tornaram 32 bits, então eles
mantiveram o nome antigo para se referir a metade do registrador e utilizaram um 'e' na frente do
nome para se referir a parte estendida (32 bits). Novos processadores oferecem registradores de 64
bits, então é necessário utilizar a letra 'r' para poder acessar a versão de 64 bits, como por exemplo
%rax.

Instruções básicas
movb $1, %ah # move 8 bits para parte alta do registrador %ax
mov $1, %ax # move 16 bits para o registrador de 16 bits %ax
movl $1, %eax # move 32 bits para o registrador estendido %eax
compl $1, %eax # compara 1 com o conteudo de %eax
je label # salta se for igual
jg label # salta se for maior
jge label # salta se for maior ou igual
jl label # salta se for menor
jle label # salta se for menor ou igual
jmp label # salta sempre
incl %eax # incremeta o conteudo do registrador %eax
addl $1, %eax # soma 1 com o conteudo de %eax e salva em %eax
subl $1, %eax # subtrai 1 do conteudo de %eax e salva em %eax
call label # empilha o endereço de retorno e salta para o rotulo
ret label # retorna de uma subrotina
int 0x80 # passa o controle para o sistema operacional

Modos de endereçamento
Todos os modos de endereçamento, com exceção do modo imediato, utilizam a seguinte forma de
acesso:
ADDRESS_OR_OFFSET (%BASE_OR_OFFSET,%INDEX,MULTIPLIER)
onde o endereço final é: ADDRESS_OR_OFFSET + %BASE_OR_OFFSET + MULTIPLIER *
%INDEX

Modo de endereçamento direto


movl 10, %eax
Essa instrução move o conteudo do endereço 10 para o registrador %eax.

Modo de endereçamento indexado


Vamos supor que STRING_START contem o endereço de uma string. Nós queremos acessar os
dois primeiros elementos dela, então utilizaremos o modo de endereçamento indexado da seguinte
maneira:

movl $0, %ecx


movl STRING_START (,%ecx,1), %eax #acessando o primeiro elemento da string
incl %ecx
movl STRING_START (,%ecx,1), %eax #acessando o segundo elemento da string
Modo de endereçamento indireto
movl (%eax), %ebx
Move o conteudo do endereço indicado pelo registrador %eax para o registrador %ebx.

Modo de endereçamento com ponteiro base


Suponha que o registrador %eax contem o endereço de uma estrutura da seguinte forma:
struct estrutura {
char nome[10];
int idade;
int telefone;
}
Para acessar o campo idade, utilizamos:
movl 10(%eax), %ebx
E para acessar o campo telefone, utilizamos:
movl 14(%eax), %ebx

Modo de endereçamento imediato


movl $1, %eax
Move a constante 1 para o registrador %eax. Note que é necessário utilizar o símbolo $ antes da
constante.
Sem o símbolo $, estaríamos movendo o conteudo da posição 1 para o registrador %eax.

System Call
Para executar uma chamada de sistema no linux, é necessário utilizar a interrupção 80h. O numero
da chamada de sistema deve estar no registrador %eax e os argumentos devem estar no registrador
%ebx, %ecx e %edx.
Por exemplo, a chamada de sistema exit deve ser invocada da seguinte maneira:
movl $1, %eax #numero da chamada exit
movl $0, %ebx #codigo de status
int 0x80h # passa o controle para o kernel

Referências

http://www.uri.com.br/~mzp/cursos/TopicosAvancados/Arquitetura%20do%208088.html
Morgan, Christopher; Waite, Mitchel. 8086/8088 Manual do microprocessador de 16 bits. Makron
books do Brasil (Editora McGraw-Hill Ltda), 1988. São Paulo.
Microprocessador 8086 - Memória
Modelo da arquitetura do 8086 operando em modo mínimo, identificando RAM e ROM.

Memória RAM

A memória RAM do 8086 é formada


através de 4 chips Intel 2142, cada um
sendo 1024 x 4-bit Static RAM (SRAM).
O processador possui um endereço de 20bits
para a memória (barramento de endereços) que
localiza o byte que esta sendo referenciado. A
memória é organizada como um array linear de
até 1 milhão de bytes, endereçados de 00000(H)
até FFFFF(H). A memória é lógicamente
dividida entre segmentos de código, dados,
dados extras e pilha que possuem até 64K bytes
cada, com cada segmento limitado a 16-bytes
por posição, conforme mostra a figura ao lado.

Todas as referências à memória RAM são feitas relativas ao endereço contido nos registradores de
segmento. Os tipos de segmentos foram escolhidos baseados nas necessidades dos programas.
Toda informação em um tipo de segmento compartilha os mesmos atributos lógicos (e.g. código ou
dados). Por estruturar a memória RAM em áreas realocaveis ou de características similares e por
automaticamente selecionar os registradores de segmento, os programas são menores, mais rápidos
e mais estruturados. Os operandos de uma Palavra (Word – 16-bits) podem estar localizados em
endereços pares ou ímpares e não estão limitados aos endereços pares como é o caso de muitos
computadores de 16-bits.
Para endereços e operandos de dados, o byte menos significativo da palavra é armazenado na parte
baixa do endereço e o byte mais significativo na parte alta do endereço.

Como mover o conteúdo de 8 bits do registrador AL para o byte no endereço de memória


0AF0 ?

Suponha que o registrador AX contenha F307, que significa que o pino de entrada A1 contém 07.
Primeiro, o processador coloca 0AF0 no barramento comum de endereço/dados. Depois, o
processador coloca um sinal em seu pino ALE (address latch enable), informando ao latch de
endereço para memorizar este valor. Agora o 0AF0 esta no barramento de endereço que sai do
latch. O processador então remove 0AF0 do barramento comum e coloca F307 no barramento. Em
seguida, o processador ativa seu pino WR (escreve) para dizer a memória que ela deverá buscar os
oito bits de baixa ordem do barramento comum, colocando-os no byte cujo endereço está no
barramento de endereço. Então a memória coloca 07 no byte com endereço 0AF0.
Mas como a memória sabe se o processador quer escrever um byte ou uma palavra?
Ou seja, que deve armazenar apenas o valor 07 na memória e não o F3 também no endereço 0AF0?
Há um sinal de controle emitido por um pino do processador chamado BHE (Bus High Enable –
ativador do byte de alta ordem do barramento), que é enviado ao mesmo tempo em que o
processador coloca o endereço no barramento comum. E, assim como o endereço, ele também vai
para o latch e é memorizado por ele. O propósito de BHE é dizer a memória se ela deve ou não
acessar os 8 bits de mais alta ordem do barramento de dados. O sinal BHE só é necessário quando o
processador escreve na memória. Quando o processador está lendo a memória, a memória não
precisa saber se ele está executando uma instrução de byte ou palavra. A memória envia sempre
uma palavra, e o processador pode decidir quantos bits ele precisa utilizar. Assim, é desnecessário
enviar o sinal de controle BHE para a ROM. Não há necessidade de um sinal BLE (Bus Low
Enable – ativador do byte de baixa ordem do barramento).
O complemento do bit menos significativo do endereço é usado para este propósito.
Sendo assim temos os seguintes casos:
• Como enviar um byte a um endereço par da memória?
• Como enviar um byte a um endereço ímpar da memória?
• Como enviar uma palavra a um endereço par da memória?
• Como enviar uma palavra a um endereço ímpar da memória?

Obs.:
Endereço ímpar desativa byte de baixa ordem do barramento de dados
Endereço par ativa byte de baixa ordem do barramento de dados

• Como enviar um byte a um endereço par da memória?


Para enviar um byte a um endereço par da memória é necessário enviar o endereço par, habilitando
a parte baixa do barramento de dados, desativar o sinal BHE para que a memória não seja capaz de
ler a parte alta do barramento e enviar o byte na parte baixa do barramento.

• Como enviar um byte a um endereço ímpar da memória?


Para enviar um byte a um endereço par da memória é necessário enviar o endereço ímpar, que irá
desativar a parte baixa do barramento de dados, e colocar o byte desejado na parte alta do
barramento de dados. Deve-se ao mesmo tempo ativar o sinal BHE para habilitar a memória a ler a
parte alta do barramento.

• Como enviar uma palavra a um endereço par da memória?


Para enviar uma palavra a um endereço par da memória e necessário enviar o endereço par,
ativando a parte baixa do barramento de dados, e enviando a palavra através das duas metades do
barramento (parte alta e baixa do barramento de dados) ao mesmo tempo.

• Como enviar uma palavra a um endereço ímpar da memória?


Para enviar uma palavra a um endereço ímpar da memória são necessários 2 acessos a memória.
No primeiro acesso é necessário enviar o endereço ímpar, desativando a leitura da parte baixa do
barramento, ativar o sinal BHE para habilitar a memória a ler a parte alta do barramento, e enviar a
metade de baixa ordem da palavra pela parte alta do barramento de dados.
No segundo acesso, o processador envia um endereço par, obtido somando-se 1 ao endereço ímpar.
É necessário desativar o sinal BHE, para habilitar a memória a ler a parte baixa do barramento, e
enviar a metade alta da palavra pela parte baixa do barramento de dados.

A tabela abaixo exemplifica o uso das combinações de endereço e BHE.

Onde A0 é o bit menos significativo do endereço, usado para saber se o endereço requisitado é par
ou ímpar. Lembre-se, BHE não é utilizado em operações de leitura, apenas é utilizado para escrita
na memória.

Memória ROM

A memória ROM do 8086 é formada por 2 chips Intel 2716 EPROM, cada um sendo 2K x 8
(2048*8 bit).
O Chip contém 2¹¹ posições de memória, cada uma contendo 8 bits. O chip contém 11 pinos de
endereço (A0 a A10) e oito pinos de dados (O0 a O7). Para se obter a informação contida em uma
posição de especificada é necessário ativar um par de sinais de controle, o pino CE (chip enable –
ativador de chip) e o OE (Output Enable – ativador de saída) do 2716. Na figura acima CE
corresponde ao pino PD/PGM e o OE corresponde ao pino CS.
Porque esta sigla – 2716?

Table 1: The Intel® product naming scheme, digit by digit


Ou seja, (2) de NMOS, (7) de EPROM e os dois dígitos restantes (16) a capacidade em K.

O problema do acesso a 1M byte

O modo original, ou modo real, é mostrado na figura acima. Como todos os registradores internos
são de 16 bits, e os endereços são de 20 bits, alguns passos auxiliares são necessários. Foi
introduzido o conceito de registradores de segmentos. Temos quatro desses no 8086, apontando
para o início dos segmentos na memória – um para o código (CS), um para a pilha (SS), um para os
dados (DS) e um extra para mais dados (ES).
Para pegar informações do endereço de memória desejado, você deve pegar os 16 bits do
registrador de segmento (Segment Register) e deslocar 4 bits a esquerda (ou seja concatenar a mais
quatro bits de valor 0) e somar aos 16 bits de deslocamento (Memory Offset), gerando assim os 20
bits necessários ao endereço.
Os bits de A15-A0 e os 4 bits restantes que estão nos pinos A19/S6-A16/S3 serão repassados ao latch
para que os armazene e repasse ao barramento de endereços, formando assim os 20 bits do
barramento de endereços.

Memória cache do 8086


O microprocessador 8086 não possui memória cache.

Você também pode gostar