Você está na página 1de 75

Captulo

Arquitetura de
processadores
Mostraremos neste captulo alguns conceitos importantes sobre o
funcionamento interno dos processadores. Tomaremos como exemplo os
processadores Intel, e com eles voc entender conceitos como execuo
especulativa, pipeline, previso de desvio, paralelismo, micro-operaes,
linguagem assembly, memria virtual, paginao e outros termos complexos.
O assunto difcil, mas vale a pena, pois o leitor passar a ter um
conhecimento mais profundo sobre o que se passa dentro de um
processador.

Registradores internos do processador


Para entender como um processador executa programas, precisamos
conhecer a sua arquitetura interna, do ponto de vista de software. Dentro de
um processador existem vrios circuitos chamados de registradores. Os
registradores funcionam como posies de memria, porm o seu acesso
extremamente rpido, muito mais veloz que o da cache L1. O nmero de
bits dos registradores depende do processador.

Processadores
Processadores
Processadores
Processadores

de 8 bits usam registradores de 8 bits


de 16 bits usam registradores de 16 bits
de 32 bits usam registradores de 32 bits
de 64 bits usam registradores de 64 bits

A figura 1 mostra os registradores internos dos processadores 8086, 8088 e


80286, todos de 16 bits. Todos os processadores tm uma linguagem baseada

8-2

Hardware Total

em cdigos numricos na memria. Cada cdigo significa uma instruo. Por


exemplo, podemos ter uma instruo para somar o valor de AX com o valor
de BX e guardar o resultado em AX. As instrues do processador que
encontramos na memria so o que chamamos de linguagem de mquina.
Nenhum programador consegue criar programas complexos usando a
linguagem de mquina, pois ela formada por cdigos numricos.
verdade que alguns programadores conseguem fazer isso, mas no para
programas muito longos, pois tornam-se difceis de entender e de gerenciar.
Ao invs disso, so utilizados cdigos representados por siglas. As siglas so
os nomes das instrues, e os operandos dessas instrues so os
registradores, valores existentes na memria e valores constantes.
Figura 8.1
Registradores internos do
processador 8086.

Por exemplo, a instruo que acabamos de citar, que soma o valor dos
registradores AX e BX e guarda o resultado em AX, representada por:
ADD AX,BX
Esta instruo representada na memria pelo seguinte cdigo de mquina:
01 D8
Portanto a instruo ADD AX,BX representada na memria por dois
bytes, com valores 01 e D8 (em hexadecimal). Os bytes na memria que
formam os programas so o que chamamos de linguagem de mquina. Esse
cdigos so lidos e executados pelo processador. J as representaes por
siglas, como ADD AX,BX, formam o que chamamos de linguagem
assembly. Quando programamos em linguagem assembly, estamos utilizando

Captulo 8 Arquitetura de processadores

8-3

as instrues nativas do processador. A linguagem assembly usada para


escrever programas que tm contato direto com o hardware, como o BIOS e
drivers. O assembly tambm chamado linguagem de baixo nvel, pois
interage intimamente com o hardware. Programas que no necessitam deste
contato direto com o hardware no precisam ser escritos em assembly, e so
em geral escritos em linguagens como C, Pascal, Delphi, Basic e diversas
outras. Essas so chamadas linguagens de alto nvel. Nas linguagens de alto
nvel, no nos preocupamos com os registradores do processador, nem com
a sua arquitetura interna. Os programas pensam apenas em dados, matrizes,
arquivos, telas, etc.
Apresentamos abaixo um pequeno trecho de um programa em linguagem
assembly. Em cada linha deste programa temos na parte esquerda, os
endereos, formados por duas partes (segmento e offset). A seguir temos as
instrues em cdigos de mquina, e finalmente as instrues em assembly.
Endereo
--------1B8D:0100
1B8D:0102
1B8D:0103
1B8D:0104
1B8D:0106
1B8D:010A
1B8D:010C
1B8D:0110
1B8D:0113
1B8D:0117
1B8D:011A
1B8D:011D

Cdigo
------------01D8
C3
16
B03A
380685D5
750E
804E0402
BF86D5
C6460000
E85F0B
8B7E34
007C1B

Assembly
-----------------------------ADD
AX,BX
RET
PUSH
SS
MOV
AL,3A
CMP
[D585],AL
JNZ
011A
OR
BYTE PTR [BP+04],02
MOV
DI,D586
MOV
BYTE PTR [BP+00],00
CALL
0C79
MOV
DI,[BP+34]
ADD
[SI+1B],BH

Quando estamos programando em linguagem assembly, escrevemos apenas


os nomes das instrues. Depois de escrever o programa, usando um editor
de textos comum, usamos um programa chamado compilador de linguagem
assembly, ou simplesmente, Assembler. O que este programa faz ler o
arquivo com as instrues (arquivo fonte) e gerar um arquivo contendo
apenas os cdigos das instrues, em linguagem de mquina (arquivo
objeto). O arquivo objeto passa ainda por um processo chamado link edio,
e finalmente se transforma em um programa, que pode ser executado pelo
processador. O Assembler tambm gera um arquivo de impresso, contendo
os endereos, cdigos e instrues em assembly, como no trecho de listagem
que mostramos acima. O programador pode utilizar esta listagem para
depurar o programa, ou seja, testar o seu funcionamento.

8-4

Hardware Total

Os cdigos hexadecimais que representam as instrues do processador so


chamados de opcodes. As siglas que representam essas instrues so
chamadas de mnemnicos.
Daremos neste captulo, noes bsicas da linguagem assembly dos
processadores modernos. No ensinaremos a linguagem a fundo, mas o
suficiente para voc entender como os processadores trabalham. Como a
programao nos processadores modernos relativamente complexa,
comearemos com o 8080, de 8 bits. A arquitetura do 8080 deu origem do
8086, que por sua vez deu origem ao 386 e aos processadores modernos.
Entendendo o 8080, que bem mais simples, ser mais fcil entender os
processadores modernos.

Linguagem Assembly 8080


Aprender assembly do 8080 no uma inutilidade, por duas razes.
Primeiro porque voc entender com muito mais facilidade o assembly dos
processadores modernos, que afinal foram inspirados no 8080. Segundo que
nem s de PCs vive um especialista em hardware. Voc poder trabalhar
com placas controladoras que so baseadas nos processadores 8051 e Z80.
Ambos so de 8 bits e tambm derivados do 8080, e so bastante utilizados
em projetos modernos.
A figura 2 mostra os registradores internos do 8080. So registradores de 8
bits, com exceo do PC (Program Counter) e do SP (Stack Pointer), que
tm 16 bits.
Figura 8.2
Registradores internos do 8080.

O registrador mais importante o acumulador. Ele o valor de sada da


unidade lgica e aritmtica (ALU), na qual so realizadas todas as operaes.
Processadores atuais permitem fazer operaes com todos os registradores,
mas no 8080, o acumulador deve obrigatoriamente ter um dos operandos, e
sempre onde ficam os resultados.
Os registradores B, C, D, E, H e L so de uso geral. Servem como operandos
nas operaes lgicas e aritmticas envolvendo o acumulador. O PC um
registrador de 16 bits, e seus valores so usados para formar o barramento de

Captulo 8 Arquitetura de processadores

8-5

endereos do processador durante as buscas de instrues. O PC tem


sempre o endereo da prxima instruo a ser executada.
O SP (Stack Pointer) muito importante. Ele serve para enderear uma rea
de memria chamada stack (pilha). A pilha serve para que os programas
possam usar o que chamamos de subrotinas, que so trechos de programa
que podem ser usados em vrios pontos diferentes. Por exemplo, se em um
programa preciso enviar caracteres para o vdeo, no preciso usar em
vrios pontos deste programa, as diversas instrues que fazem este trabalho.
Basta fazer uma subrotina com essas funes e cham-la onde for
necessria. A subrotina deve terminar com uma instruo RET, que faz o
programa retornar ao ponto no qual a subrotina foi chamada. Para chamar
uma subrotina, basta usar a instruo CALL. Quando esta instruo
executada, automaticamente armazenado na pilha, o endereo da instruo
imediatamente posterior instruo CALL (endereo de retorno). Subrotinas
podem chamar outras subrotinas, permitindo assim criar programas mais
complexos. O Stack Pointer sempre aponta para o topo da pilha, e
automaticamente corrigido medida em que so usadas instrues CALL e
RET. A instruo RET consiste em obter o endereo de retorno existente no
topo da pilha e copi-lo para o PC (Program Counter). Isso far com que o
programa continue a partir da instruo posterior instruo CALL.
Os FLAGS so um conjunto de 8 bits que representam resultados de
operaes aritmticas e lgicas. So os seguintes esses bits:
Smbolo
Z
CY
P
S
AC

Nome
Zero
Carry
Parity
Signal
Aux. Carry

Descrio
Indica se o resultado da operao foi zero
Indica se uma operao aritmtica teve vai um ou pede emprestado
Indica a paridade do resultado da operao.
Indica o sinal de uma operao, se foi positivo ou negativo
Carry auxiliar, em algumas instrues especiais.

Apesar de ser um processador de 8 bits, o 8080 capaz de realizar algumas


operaes de 16 bits. Nessas operaes, os registradores B e C so tratados
como um valor de 16 bits. O mesmo ocorre com o par D/E e H/L.
Alm de manipular os registadores, o 8080 tambm permite obter valores na
memria. Esses valores podem ser de 8 ou 16 bits, e nas instrues que
fazem esses acessos, basta indicar o endereo de 16 bits da posio de
memria que desejamos acessar. Alm disso possivel usar os registradores
HL, BC e DE como apontadores para posies de memria. Nas instrues
do assembly do 8080, o pseudo registrador M na verdade a posio de
memria (8 bits) cujo endereo est em HL.

8-6

Hardware Total

Programar em assembly do 8080 consiste em utilizar suas instrues,


manipulando seus registradores para executar as funes que desejamos.
Instrues de movimentao de dados

MOV: Move dados entre dois registradores diferentes. Assim como na


maioria das instrues que envolvem registradores, podemos usar M como
sendo a posio de memria apontada por HL. Exemplos:
MOV A,C
MOV C,E
MOV D,M
MOV M,A

; A=C
; C=E
; D=M, ou seja, a posio de memria indicada
; por HL
; M=A

Note que quando escrevemos programas em assembly, podemos usar


comentrios em cada linha, bastando usar um ponto-e-vrgula aps a
instruo. Tudo o que estiver depois do ponto-e-vrgula ser ignorado pelo
assembler. Aqui aproveitamos este conveno para colocar tambm
comentrios explicativos nas instrues de nossos exemplos.
MVI: Carrega um valor constante de 8 bits em um registrador de 8 bits ou
na posio de memria apontada por HL. Exemplos:
MVI C,200
MVI A,15h
MVI M,150
MVI L,32

; Carrega o registrador C com 200 (decimal)


; Carrega o acumulador com 15 hexadecimal
; Armazena o valor 150 em [HL]
; Carrega o registrador L com 32 em decimal

Aproveitamos para alm de exemplificar essas instrues, apresentar mais


algumas convenes usadas na linguagem assembly. Os nmeros podem ser
representados nos formatos binrio, octal, hexadecimal ou decimal. Quando
no usamos sufixos aps os nmeros, considera-se que so nmeros
decimais. Para nmeros hexadecimais, usamos o sufixo H. Quando um
nmero hexadecimal comea com A, B, C, E, E ou F, temos que usar um
0 no incio, para que o assembler no pense que se trata de uma varivel, e
no um nmero. Nmeros binrios devem terminar com b, e nmeros
octais devem terminar com q. Exemplos:
190
10010111b
325q
8BC3h

Captulo 8 Arquitetura de processadores

8-7

Os quatro nmeros acima esto expressos respectivamente em decimal,


binrio, octal e hexadecimal.
Outra conveno que vamos introduzir aqui usar o smbolo [HL] para
indicar a posio de memria cujo endereo dado por HL. Na linguagem
assembly do 8080, este o papel do smbolo M. No usamos [HL], porm
esta conveno foi adotada no assembly do 8086 e outros processadores mais
novos. Da mesma forma vamos usar os smbolos [BC] e [DE] para indicar as
posies de memria apontadas por BC e por DE.
LXI: Carrega um valor constante de 16 bits em um dos pares BC, DE, HL e
no Stack Pointer. Exemplos:
LXI H,35AFh
LXI D,25100
LXI B,0
LXI SP,200

; Carega HL com o valor 35AF hexadecimal


; Carrega DE com o valor 25100 decimal
; Carrega BC com 0
; Carrega o Stack Pointer com 200 decimal

Note que os nmeros de 8 bits podem assumir valores inteiros positivos de 0


a 255 decimal (ou de 0 a FF em hexadecimal). Os nmeros inteiros positivos
de 16 bits podem assumir valores entre 0 e 65.535 decimal (ou 0 a FFFF
hex).
Obseve a instruo LXI H, 35AFh. Este valor 35AF formado por 16 bits,
sendo que os 8 bits mais significativos tm o valor 35 hex, e os 8 bits menos
significativos tm o valor AF hex. No par HL, o registrador H o mais
significativo, e o registrador L o menos significativo. Sendo assim o
registrador H ficar com 35 hex e o registrador L ficar com AF hex.
LDA e STA: A instruo LDA carrega o acumulador (registrador A) com o
valor que est no endereo de memria especificado. A instruo STA faz o
inverso, ou seja, guarda o valor de A na posio de memria especificada.
Exemplos:
LDA 1000h
STA 2000h

; Carrega A com o valor existente em [1000h]


; Guarda o valor de A em [2000h]

Estamos utilizando a partir de agora a notao [nnnn] para indicar a posio


de memria cujo endereo nnnn. Esta notao no usada no assembly
para 8080, mas usada no assembly do 8086 e superiores.
LHLD e SHLD: A instruo LHLD carrega nos registradores H e L, o valor
de 16 bits existente nas duas clulas de memria cujo endereo
especificado. A instruo SHLD faz o inverso. Exemplos:

8-8

Hardware Total
LHLD 1000h
SHLD 2000h

; Faz L=[1000h] e H=[1001h]


; Guarda L em [2000h] e H em [2001h]

Aqui vai mais um conceito importante. A memria do 8080 uma sucesso


de bytes, mas podemos tambm acessar words, ou seja, grupos de 16 bits. A
operao envolve dos bytes consecutivos, e nas instrues indicamos apenas
o endereo do primeiro byte. Os 8 bits menos significativos esto
relacionados com a posio de memria indicada, e os 8 bits seguintes esto
relacionados com a prxima posio. A figura 3 ilustra o que ocorre ao
usarmos a instruo SHLD 2000h, levando em conta que H est com o valor
35h e L com o valor 8Ch.
Figura 8.3
Armazenando HL em [2000h].

Esta conveno utilizada por todos os processadores Intel. Sempre que


feita uma leitura ou escrita na memria, as partes menos significativas dizem
respeito aos endereo menores, e as partes mais significativas correspondem
aos endereos maiores.
LDAX e STAX: Essas instrues fazem respectivamente operaes de load
(carrega) e store (guarda) do acumulador, usando a posio de memria cujo
endereo est no par BC ou DE. Exemplos:
LDAX D
STAX B
LDAX B
STAX D

; A = [DE]
; [BC] = A
; A = [BC]
; [DE] = A

Note que estamos usando as notaes [BC] e [DE] para indicar as posies
de memria cujos endereos so dados por BC e DE. Observe que as
instrues LDAX H e STAX H no existem, mas em seu lugar temos MOV
A,M e MOV M,A que fazem a mesma coisa.

Captulo 8 Arquitetura de processadores

8-9

XCHG: Troca o valor de HL com o valor de DE. Esta instruo s usada


na forma:
XCHG

; DE HL

Trecho de programa com movimentao de dados

Mostraremos agora uma seqncia de instrues de movimentao de dados


apresentadas aqui. Usaremos depois de cada instruo, um ponto-e-vrgula,
seguido de comentrios. Esta uma prtica comum nos programas em
assembly e em outras linguagens. O comentrio no produz instrues para
o processador, apenas serve para o programador explicar melhor o seu
programa.
INIC:

MVI A,100
MOV C,A

; Carrega A com o valor 100 decimal


; Copia o valor de A para o registrador C

LXI H, 300h

; Carrega HL com o valor 300h. H ficar com 03 e L ficar com 00

MVI M,40

; Armazena no endereo 300h (apontado por HL), o valor 40

LXI D, 1000h

; Carrega DE com o valor 1000h

MOV A,M

; Move para A o valor armazanedo no endreo 300h

STAX D

; Guarda o valor de A na posio 1000h da memria

SHLD 2000h

; Guarda o valor de HL nas posies 2000 e 2001

XCHG

; Troca os valores de DE e HL

Na listagem acima, INIC: o que chamamos de LABEL. Ele ser


entendido pelo assembler como um endereo que dever ser utilizado
posteriormente em alguma instruo.
Instrues aritmticas

ADD: Soma com A, o valor do registrador especificado, ou da posio de


memria apontada por HL (M). O resultado da operao armazenado em
A. Exemplos:
ADD B
ADD C
ADD L
ADD M

; A = A+B
; A = A=C
; A = A+L
; A = A+[HL]

Assim como ocorre com todas as instrues aritmticas e lgicas, os flags (Z,
CY, P, S e AC) so atualizados de acordo com o resultado da operao. Por
exemplo, se somarmos C8h com 72h, o resultado ser 13Ah. Este valor no
cabe em 8 bits, portanto o resultado ser 3Ah e o bit Carry ser ligado para
indicar que ocorreu um vai 1.

8-10

Hardware Total

ADI. Soma com A, o valor constante especificado. O resultado fica


armazenado em A. Exemplos:
ADI 90
ADI 35

; A = A+90
; A = A+35

ADC: Semelhante instruo ADD, exceto que o bit Carry tambm


adicionado. Esta operao serve para fazer somas com vai 1. Desta foram
podemos dividir nmeros grande em valores de 8 bits, e somar 8 bits de
cada vez. Sempre que fazemos uma soma, o Carry ficar com o vai 1 da
operao, e assim poder ser usado para somar a parcela seguinte.
Exemplos:
ADC L
ADC D
ADC M

; A = A+L+carry
; A = A+D+carry
; A = A+[HL]+carry

ACI: Semelhante instruo ADI, exceto pelo Carry tambm entrar na


soma. Exemplos:
ACI 90
ACI 84

; A = A+90+carry
; A = A+84+carry

SUB: Faz uma subtrao de A com o registrador (A = A-registrador) ou com


M. Exemplos:
SUB D
SUB C
SUB M

; A = A-D
; A = A-C
; A = A-[HL]

Nesta operao, o carry ligado para indicar o resultado negativo, o que


serve para fazer clculos com vrios dgitos, usando o mtodo de pedir
emprestado.
SUI: Subtrai do acumulador, o nmero especificado. Por exemplo:
SUI 20
SUI 82
SUI 0DFh

; A = A-20
; A = A-82
; A = A-DF (hex)

SBB: Similar instruo SUB, exceto que leva em conta o valor do carry.
Serve para fazer clculos com o mtodo de pedir emprestado. Exemplos:
SBB C
SBB L
SBB M

; A = A-C-carry
; A = A-L-carry
; A = A-[HL]-carry

Captulo 8 Arquitetura de processadores

8-11

SBI: Similar instruo SUI, exceto que leva em conta o valor do carry.
Serve para fazer clculos com o mtodo de pedir emprestado. Exemplos:
SBI 2Fh
SBI 73h

; A = A-2Fh-carry
; A = A-73h-carry

INR: Incrementa em uma unidade o valor do registrador especificado. Serve


para implementar contadores. Exemplos:
INR A
INR C
INR D
INR L
INR M

; A = A+1
; C = C+1
; D = D+1
; L = L+1
; [HL] = [HL]+1

Quando o valor do registrador FF e usamos esta instruo, ele passar a


ficar com o valor 00 e o bit Carry ser ligado. O bit Zero tambm ser
ligado, indicando que o resultado da operao foi zero.
DCR: Diminui de uma unidade o contedo do registrado especificado. Esta
instruo usada para implementar contagens decrescentes. Exemplos:
DCR A
DCR C
DCR D
DCR H
DCR M

; A = A-1
; C = C-1
; D = D-1
; H = H-1
; [HL] = [HL]-1

Quando o registrador tem o valor 1 e usamos esta instruo, o seu contedo


passar a ser 00. O bit Zero ser ligado, indicando que o resultado da
operao foi 0. Se o registrador estiver com o valor 00 e usarmos novamente
esta instruo, seu valor passar a ser FF. O bit Carry ser ligado, para
indicar que o resultado tem valor negativo.
INX e DCX: Essas instrues so similares s instrues INR e DCR, exceto
que operam com pares de registradores (BC, DE e HL) e com o Stack
Pointer. No podem ser usadas diretamente para implementar contadores,
pois elas no afetam os valores dos flags, ou seja, no avisam se o resultado
foi zero, positivo ou negativo. Essas instrues no tinham objetivo de fazer
contagem, mas sim de usar os registradores como ponteiros para a memria.
Ao lanar o 8086, a Intel corrigiu este deslize. As instrues
correspondentes nos processadores de 16 bits afetam os valores dos flags, o
que importante para tomar decises posteriores em funo do resultado da
contagem. Exemplos:

8-12

Hardware Total
INX H
INX D
DCX B
INX SP

; HL = HL+1
; DE = DE+1
; BC = BC-1
; SP = SP+1

Note que apesar do 8080 ser um processador de 8 bits, INX e DCX so


consideradas instrues de 16 bits.
DAA: Esta instruo usada na manipulao de nmeros codificados no
formato BCD (Bynary Coded Decimal). Nesta representao, um valor de 8
bits dividido em 2 grupos de 4 bits. Um grupo de 4 bits representa o dgito
das unidades e o outro grupo representa o dgito das dezenas, no formato
decimal. Nmeros neste formato podem ser somados e subtrados pelas
mesmas instrues que manipulam nmeros binrios. A nica diferena
que no final da operao preciso usar a instruo DAA para fazer o ajuste
decimal. Por exemplo, se quisermos somar os nmeros 48 e 36 (BCD),
usamos as instrues comuns (ADD, ADI, etc.) e encontraremos o resultado
7E (hex). Entretanto o resultado esperado, considerando o formado BCD,
seria 84 (pensando em decimal). Logo aps fazer a soma, se usarmos a
instruo DAA, aquele valor 7E resultar em 84.
DAD: Esta uma operao de soma em 16 bits. Soma o valor de 16 bits
presente em HL com o par de registradores especificado. Este par pode ser
BC, DE, HL ou SP. O resultado colocado em HL, e o bit Carry afetado,
refletindo um eventual vai 1. Exemplos:
DAD B
DAD D
DAD H
DAD SP

; HL = HL+BC
; HL = HL+DE
; HL = HL+HL
;HL = HL+SP

Para exemplificar as instrues apresentadas at aqui, vamos mostrar um


exemplo no qual movemos 30 bytes localizados a partir do endereo 1000h
para o endereo 2000h.

TRAN:

LXI H, 1000h
LXI D, 2000h
MVI C, 30
MOV A,M
STAD X
INX H
INX D
DCR C
JNZ TRAN

; HL vai apontar para a origem


; DE vai apontar para o destino
; C ser usado como contador:
; Pega o byte da origem
; Guarda no destino
; Aponta para o prximo byte
; Aponte para o prximo byte
; Decrementa o contador
; Vai para TRAN se no chegou a ZERO

Captulo 8 Arquitetura de processadores

8-13

Alm das instrues j conhecidas, estamos usando a instruo JNZ (Jump if


not Zero). Este instruo um exemplo de desvio condicional. O programa
continuar a partir do endereo TRAN caso o bit ZERO no esteja ativado,
ou seja, se o resultado da operao anterior (C=C-1) no foi zero. Quando a
contagem chegar a zero, a instruo JNZ no provocar o desvio, e o
programa continuar com a instruo seguinte.
Instrues lgicas

As instrues lgicas so necessrias para que os programas possam tomar


decises em funo dos dados. So instrues que realizam operaes AND,
OR, XOR (ou exclusivo) e NOT (negao). Existem ainda instrues de
comparao, instrues para manipular o bit carry e instrues para rotao
de bits.
Para entender o funcionamento dessas instrues, temos que lembrar as
tabelas verdade dos operadores NOT, AND, OR e XOR:
X
0
1

NOT X
1
0

X
0
0
1
1

Y
0
1
0
1

X AND Y
0
0
0
1

X
0
0
1
1

Y
0
1
0
1

X OR Y
0
1
1
1

Como vemos na tabela acima, o operador NOT faz a inverso do bit sobre o
qual atua. O operador AND dar resultado 1 apenas quando ambos os bits
forem 1, e dar 0 em caso contrrio. O operador OR dar resultado 0
somente quando ambos os bits forem 0. O operador XOR dar resultado 1
se os dois bits forem diferentes, e 0 se ambos os bits forem iguais.
X
0
0
1
1

Y
0
1
0
1

X XOR Y
0
1
1
0

Essas operaes so envolvem apenas um bit, mas nas instrues lgicas dos
processadores, atuam individualmente sobre cada um dos bits. Por exemplo,
se calcularmos 10111110 AND 10010101, teremos o seguinte resultado:
10111110
10010101 AND
-----------10010100

8-14

Hardware Total

Note que o primeiro bit do resultado obtido fazendo a operao AND com
os primeiros bits das duas parcelas, e assim por diante.
ANA e ANI: Realiza uma operao AND, bit a bit, do acumulador com o
registrador especificado. O resultado da operao fica no acumulador. A
instruo ANI faz o AND do acumulador com um valor constante.
ANA B
ANA C
ANA A
ANA M
ANI 3Fh

; A = A AND B
; A = A AND C
; A = A AND A
; A = A AND [HL]
; A = A AND 3F

Uma das vrias aplicaes desta instruo testar se determinados bits so


zero ou 1. Por exemplo, se fizermos ANI 00000100b, podemos usar a seguir
uma instruo JZ ou JNZ que causaro desvio ou no dependendo do fato
do bit 2 estar ligado ou desligado.
Chegou a hora de apresentar mais um conceito: a identificao dos bits. Em
um grupo de 8 bits, chamamos cada um desses bits, da direita para a
esquerda, de bit 0, bit 1, at bit 7, ou seja:
bit7

bit6

bit5

bit4

bit3

bit2

bit1

bit0

ORA, ORI, XRA, XRI: ORA faz a operao OR do acumulador com o


registrador especificado; ORI faz o mesmo com um valor constante; XRA faz
a operao XOR (OU Exclusivo) do acumulador com o registrador
especificado, XRI faz o mesmo com um valor constante. Exemplos:
XRA B
XRA C
ORA L
ORI 20h
XRI 04h
XRA A

; A = A XOR B
; A = A XOR C
; A = A XOR L
; A = A OR 20h
; A = A XOR 04h
; A = A XOR A

Aproveitamos para mostrar alguns macetes de programao assembly. A


instruo ORI serve para ligar um bit selecionado. Para ligar os bits 7, 6, 5, 4,
3, 2, 1 e 0 basta fazer um ORI com valores 80h, 40h, 20h, 10h, 8, 4, 2 e 1,
respectivamente. A instruo XRI far a inverso do bit correspondente (use
os mesmos valores que indicamos para a instruo ORI). A instruo XRA
A tem o efeito de zerar o acumulador.
CMP, CPI: A instruo CMP compara o acumulador com outros
registradores. A instruo CPI compara o acumulador com um valor

Captulo 8 Arquitetura de processadores

8-15

constante de 8 bits. O resultado do acumulador no afetado. As instrues


apenas afetam os bits Zero e Carry. Aps essas instrues podem ser usados
desvios condicionais que testam esses dois bits. Esses bits ficaro ligados ou
desligados de acordo com os valores comparados:
A maior que Valor
A igual a Valor
A menor que Valor

Z=0
Z=1
Z=0

Cy=0
Cy=0
Cy=1

Exemplos:
CMP C
CMP L
CMP M
CPI 4Ch

; Compara A com C
; Compara A com L
; Compara A com [HL]
; Compara A com 4C

RLC, RRC: Essas duas instrues so usadas para deslocar os bits do


acumulador. RLC desloca para esquerda e RRC desloca para a direita. A
operao mostrada na figura 4.
Figura 8.4
Instrues RLC e RRC.

Na instruo RLC, cada bit assume o lugar do bit imediatamente sua


esquerda (ou seja, o bit imediatamente mais significativo). O bit 7
transferido para o bit 0, e uma cpia do bit 7 feita no Carry. Na instruo
RRC, o deslocamento feito de forma inversa. O bit 0 copiado para o bit
7 e para o Carry. Essas instrues tm diversas aplicaes, entre as quais, a
implementao de operaes de multiplicao e diviso, j que o 8080 no
as possui no seu conjunto de instrues.
Essas instrues no tm parmetros. So usadas simplesmente nas formas
RRC e RLC.
RAL, RAR: Tambm fazem deslocamentos dos bits do acumulador, para a
esquerda e para a direita. A diferena que neste caso, a rotao feita com

8-16

Hardware Total

9 bits, sendo 8 do acumulador e mais o Carry. A operao dessas instrues


mostrada na figura 5.
Figura 8.5
Instrues RAL e RAR.

CMA: Complementa o acumulador, ou seja, faz a inverso de todos os seus


bits.
STC, CMC: Essas instrues servem para carregar valores no Carry. A
instruo STC faz Carry=1, e a instruo CMC inverte o valor do Carry.
Note que no existe uma instruo para zerar o Carry. Ao invs dela,
podemos usar STC seguida de CMC, ou ento usar a instruo ANA A ou
ORA A, que no alteram o valor de A mas zeram o Carry.
Instrues de desvio

As instrues de desvio so importantssimas, e so executadas o tempo


todo. O processador tende a seguir uma seqncia de instrues, na mesma
ordem na qual so encontradas na memria, ou seja, depois de cada
instruo executada a instruo seguinte. Um programa que s executa
instrues na sequncia no tem muita utilidade. Todos os processadores
precisam de insrues de desvio, que fazem com que a execuo seja
continuada a partir de um outro ponto qualquer do programa. J mostramos
um exemplo de trecho de programa que usa a instruo JNZ (jump if not
zero) para implementar a repetio de um trecho um certo nmero de vezes.
Um trecho de programa que executado diversas vezes chamado de
LOOP.
JMP: Esta a principal e mais simples instruo de desvio. o que
chamamos de desvio incondicional, ou seja, sempre ser executada, no
importa em que condies. Por exemplo, ao encontrar a instruo JMP
8000h, o processador continuar a execuo do programa a partir das
instrues localizadas no endereo 8000h.

Captulo 8 Arquitetura de processadores

8-17

CALL e RET: A instruo CALL tambm um desvio, mas bem diferente


do JMP. uma chamada de rotina. Uma rotina um trecho de programa
que pode ser chamado de vrios pontos de um programa principal. No final
de uma rotina deve exitir uma instruo RET, que faz o processador retornar
ao ponto imediatamente aps a instruo CALL.
Comparando as instrues CALL e JMP, a nica diferena que no caso da
instruo CALL, o endereo da prxima instruo (endereo de retorno)
guardado no topo da pilha. O valor do SP (stack pointer atualizado para
permitir novos empilhamentos). A instruo RET simplesmente obtem o
endereo no topo da pilha e o coloca em PC (Program Counter), fazendo
com que a execuo continue de onde parou.
Mostraremos novamente nosso pequeno trecho de programa que move um
certo nmero de bytes de uma parte para outra da memria, mas desta vez
usando uma rotina. O trecho comea no endereo 1000, onde carregamos o
par HL com o endereo da origem, DE com o endereo do destino e o
registrador C com o nmero de bytes (no caso so 16 bytes, que
corresponde a 10 em hexadecimal). A seguir chamada uma rotina que est
no endereo 1020. Esta a rotina responsvel pela movimentao. Depois
que a rotina chamada, a prxima instruo a ser executada JMP 0, que
est no endereo 100A.
1000:
1003:
1006:
1008:
100A:
...
1020:
1021:
1022:
1023:
1024:
1025:
1028:

21
11
0E
CD
C3

00
00
10
20
00

81
82
10
00

7E
12
23
13
0D
C2 20 10
C9

LXI H, 8100
LXI D, 8200
MVI C,10
CALL 1020
JMP 0
MOV A,M
STAX D
INX H
INX D
DCR C
JNZ 1020
RET

Observe que a rotina de movimentao localizada no endereo 1020


genrica. Ela pode mover dados entre duas posies quaisquer de memria,
dadas por HL e DE. O nmero de bytes tambm pode ser qualquer (de 1 a
255), e deve ser dado em C. Dizemos ento que HL, DE e C so os
parmetros desta rotina.
importante entender o que acontece com a stack ao executarmos
instrues CALL e RET. Na instruo CALL, o endereo de retorno e
empilhado. Na instruo RET, o endereo de retorno desempilhado. No

8-18

Hardware Total

trecho de programa mostrado acima, a instruo CALL causar o


empilhamento do endereo 100A, que o endereo da instruo seguinte, e
ser o endereo de retorno.
Figura 8.6
Empilhamento de um endereo de
retorno na stack, feito por uma instruo
CALL.

A figura 6 ilustra o que est ocorrendo. Digamos que o registrador SP (Stack


Pointer) esteja com o valor inicial 0100. A stack aumenta para trs, ou seja,
para endereos menores. Ao executar a instruo CALL, o processador
empilhar o endrereo 100A nos bytes imediatamente anteriores ao
endereo indicado por SP. Portanto ocupar os endereos 00FF e 00FE. O
SP ser atualizado para 00FE, que ser o novo topo da pilha. Assim novos
endereos podero ser empilhados quando forem executadas outras
instrues CALL.
A instruo RET far exatamente o inverso do mostrado na figura 6. O Stack
Pointer estar com o valor 00FE, portanto ir obter o endereo de retorno
nas posies 00FE e 00FF da memria, e encontrar 100A. O Stack Poitner
ser ento atualizado para 0100, que ser o novo topo da pilha.
JMPs, CALLs e RETs condicionais Alm das instrues JMP, CALL e
RET, que so incondicionais, existem suas verses condicionais, que so
executadas apenas quando uma determinada condio satisfeita. Essas
condies so baseadas nos flags: Zero, Carry, Parity e Signal. So elas:
Instruo
JZ

Ao
Pula se Zero est ligado

JNZ

Pula se Zero est desligado

JC
JNC
JPE
JPO
JP
JM

Pula se Carry est ligado


Pula se Carry est desligado
Pula se paridade Par
Pula se paridade mpar
Pula se sinal positivo
Pula se sinal negativo

Interpretao
Pula se o resultado zero,
Pula se iguais
Pula se o resultado no zero,
Pula se diferentes
Pula se menor, pula se carry
Pula se maior ou igual, pula se no carry
Pula se nmero de bits 1 par
Pula se nmero de bits 1 mpar
Pula se resultado positivo ou zero
Pula se resultado negativo

Captulo 8 Arquitetura de processadores

8-19

Nesta tabela mostramos a ao de cada uma desas instrues, e ainda uma


interpretao dessas aes. Por exemplo, a instruo JZ pode ser usada logo
depois uma operao aritmtica e queremos que seja feito o desvio se o
resultado foi zero. Pode ainda ser usada depois de uma comparao e
queremos que o desvio seja feito se os valores comparados forem iguais.
Da mesma forma existem as chamadas condicionais de rotinas e os retornos
condicionais:
CZ, CNZ, CC, CNC, CPE, CPO, CP, CM
RZ, RNZ, RC, RNC, RPE, RPO, RP, RM
RST n: Esta instruo similar a uma instruo CALL. A diferena que
ela no precisa que seja indicado o endereo, pois est implcito. Podemos
us-la de 8 formas diferentes:
RST 0 / RST 1 / RST 2 / RST 3 / RST 4 / RST 5 / RST 6 / RST 7
Essas instrues tm o mesmo efeito que:
CALL 0000 / CALL 0008 / CALL 0010 / CALL 0018 / / CALL 0038
O objetivo dessas instrues economizar bytes, j que ao invs dos 3 bytes
ocupados por uma instruo CALL, usa apenas um byte. Quando uma certa
rotina usada muitas vezes em um programa, podemos coloc-la a partir de
um desses endereos e cham-las atravs das instrues RST. Note que esses
endereos esto separados apenas por 8 bytes, portanto no possvel
colocar diretamente neles, rotinas maiores que este tamanho. O que
normalmente fazemos usar nesses endereos, instrues de JMP para outra
rea onde ficam as rotinas.
PCHL: Carrega em PC o valor existente em HL. Isto equivalente a
executar um JMP para o endereo especificado por HL. til quando
queremos desviar para um local varivel, em funo do valor em HL, obtido
por exemplo, de uma tabela de endereos.
Operaes com a pilha, E/S e controle

Para completar o conjunto de instrues do 8080, falta apenas uma pequena


miscelnea de instrues para para manipulao da stack, entrada/sada e
controle.

8-20

Hardware Total

PUSH e POP: J vimos como a stack usada para emplilhar e desempilhar


endereos nas instrues CALL e RET. So sempre valores de 16 bits. Alm
de endereos, podemos ainda empilar e desempilhar dados na stack. Por
exemplo, a instruo PUSH H guardar o valor de HL no topo da stack. A
instruo POP H far o inverso, ou seja, retirar da pilha o valor do seu topo
e o copiar para HL. As instrues PUSH e POP podem ser usadas com os
parmetros B, D e H, que operam com os pares BC, DE e HL. Podemos
ainda usar PUSH PSW, que salva em um grupo de 16 bits, o valor do
acumulador e dos flags. A instruo POP PSW faz o inverso.
XTHL: Lembra da instruo XCHG, que troca os valores de HL e DE? A
instruo XTHL faz algo parecido. Troca os valores de HL e do topo da
pilha.
SPHL: J vimos tambm a instruo LXI SP, Valor, que carrega um valor
fixo no stack pointer. Isto necessrio na inicializao dos programas,
quando temos que definir onde ficar a pilha. A instruo SPHL mais
flexvel. Ela cria a stack em qualquer ponto da memria, bastando indicar
seu endereo em HL.
IN, OUT: So instrues importantssimas que servem para o processador
trocar dados com o mundo exterior. Atravs da instruo IN podemos obter
dados provenientes de interfaces que esto ligadas aos perifricos. O dado
lido ficar no acumulador. A instruo OUT faz o inverso, ou seja, transfere
para o endereo de E/S especificado, o valor que est no acumulador.
Exemplos:
IN 70h
OUT 40h

; L dado que est no endereo de E/S 70h


; Envia para o endereo de E/S 40h, o valor de A

DI, EI: Essas instrues controlam as interrupes de hardware. DI faz com


que as interrupes sejam desabilitadas. EI faz com que sejam habilitadas
novamente. So teis durante o atendimento a interrupes de hardware e
em certos trechos crticos que no podem ser interrompidos.
HLT: Halt. Faz o processador parar de executar instrues. O processador
s sai deste estado quando ocorre uma interrupo.
NOP: No Oparation. Esta instruo no faz nada. usada quando queremos
fazer uma pausa entre duas instrues seguidas. Normalmente isso
necessrio quando temos um programa que faz controle direto do hardware.

Captulo 8 Arquitetura de processadores

8-21

Isto pode ser necessrio, por exemplo, para fazer o processador esperar um
pouco mais pela execuo das funes de certos circuitos lentos.
Um pequeno programa para 8080

Finalizamos a apresentao das instrues do 8080, mostrando um pequeno


programa. Este programa faz o recebimento dos caracteres do teclado e os
coloca na memria a partir do endereo 1000h. O nmero mximo de
caracteres que poder ser recebido 80. Quando terminarmos de digitar a
linha, devemos teclar ENTER, cujo cdigo hexadecimal 0Dh. Estamos
supondo aqui que o computador tem um console (teclado/vdeo
combinados) ligado em uma interface serial que ocupa os endereos de E/S
80h e 81h. O endereo 80h a porta de dados, que envia caracteres do para
o vdeo (escrita) e l caracteres do teclado (leitura). A porta 81h usada
como status. Seus bits 0 e 1 indicam respectivamente se a interface tem um
dado vindo do teclado e se est pronta para enviar um dado para o vdeo.

LECH:

FIM:

LXI H, 1000h
MVI C,0
CALL INCHAR
CPI 0Dh
JZ FIM
MOV B,A
MOV A,C
CPI 80
JZ LECH
MOV A,B
MOV M,A
CALL OUTCHAR
INR C
INX H
JMP LECH
JMP 0

INCHAR:

IN 81h
ANI 01
JZ INCHAR
IN 80h
RET

OUTCHAR:

PUSH B
MOV B,A
IN 81h
ANI 02
JZ OUTC1
MOV A,B
OUT 80h
POP B
RET

OUTC1:

; Aponta para a rea de memria


; Zera o contador de bytes
; L caractere do teclado
; Testa se foi ENTER
; Vai para o fim se teclou ENTER
; Se no foi enter, guarda caracter em B
; Pega o contador de caracteres
; Testa se chegou a 80
; Se h chegarm 80, ignora e volta a ler
; Se no chegou a 80, pega o caracter
; Guarda caracter na memria
; Envia o caracter para o vdeo
; Incrementa o contador de caracteres
; Incrementa o ponteiro
; Vai ler o prximo caracter
; Pula para 0000 quando terminar o programa
; Rotina de leitura de caracter
; L o status da porta serial
; Testa se o bit 0 est ligado
; Se est desligado continua tentando
; L o cdigo do caracter
; e retorna com o caracter em A
; Rotina que envia para o vdeo, caracter
; que est em A
; Salva para BC na pilha
; Guarda em B o caracter
; L o status da porta serial
; Testa o bit 1
; Se bit 1 est zerado, continua esperando
; Pega o caracter
; Envia o caracter
; Restaura o valor original de BC
; e retorna

8-22

Hardware Total

Cdigos das instrues do 8080

Apresentamos a seguir uma tabela com os cdigos de todas as instrues do


8080. No que voc v programar 8080, mas para que voc tenha uma idia
da relao entre as instrues e os seus cdigos. Na tabela que se segue,
temos as seguintes convenes:

Op
Cod
e
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
10
11
12
13
14
15
16
17
18
19
1A
1B
1C
1D
1E
1F
20
21
22
23
24
25
26
27

D8 representa um dado constante de 8 bits


D16 representa um dado constante de 16 bits
Addr representa um endereo de 16 bits

Mnemonic

Op
Code Mnemonic

NOP
LXI B,D16
STAX B
INX B
INR B
DCR B
MVI B,D8
RLC
DAD B
LDAX B
DCX B
INR C
DCR C
MVI C,D8
RRC
LXI D,D16
STAX D
INX D
INR D
DCR D
MVI D,D8
RAL
DAD D
LDAX D
DCX D
INR E
DCR E
MVI E,D8
RAR
LXI H,D16
SHLD ADDR
INX H
INR H
DCR H
MVI H,D8
DAA

2B
2C
2D
2E
2F
30
31
32
33
34
35
36
37
38
39
3A
3B
3C
3D
3E
3F
40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F
50
51
52

DCX H
INR L
DCR L
MVI L,D8
CMA
LXI SP,d16
STA ADDR
INX SP
INR M
DCR M
MVI M,D8
STC
DAD SP
LDA ADDR
DCX SP
INR A
DCR A
MVI A,D8
CMC
MOV B,B
MOV B,C
MOV B,D
MOV B,E
MOV B,H
MOV B,L
MOV B,M
MOV B,A
MOV C,B
MOV C,C
MOV C,D
MOV C,E
MOV C,H
MOV C,L
MOV C,M
MOV C,A
MOV D,B
MOV D,C
MOV D,D

Op
Cod
e
56
57
58
59
5A
5B
5C
5D
5E
5F
60
61
62
63
64
65
66
67
68
69
6A
6B
6C
6D
6E
6F
70
71
72
73
74
75
76
77
78
79
7A
7B
7C
7D

Mnemonic
MOV D,M
MOV D,A
MOV E,B
MOV E,C
MOV E,D
MOV E,E
MOV E,H
MOV E,L
MOV E,M
MOV E,A
MOV H,B
MOV H,C
MOV H,D
MOV H,E
MOV H,H
MOV H,L
MOV H,M
MOV H,A
MOV L,B
MOV L,C
MOV L,D
MOV L,E
MOV L,H
MOV L,L
MOV L,M
MOV L,A
MOV M,B
MOV M,C
MOV M,D
MOV M,E
MOV M,H
MOV M,L
HLT
MOV M,A
MOV A,B
MOV A,C
MOV A,D
MOV A,E
MOV A,H
MOV A,L

Op
Cod
e
81
82
83
84
85
86
87
88
89
8A
8B
8C
8D
8E
8F
90
91
92
93
94
95
96
97
98
99
9A
9B
9C
9D
9E
9F
A0
A1
A2
A3
A4
A5
A6
A7
A8

Mnemonic

Op
Code

Mnemonic

Op
Code

Mnemonic

ADD C
ADD D
ADD E
ADD H
ADD L
ADD M
ADD A
ADC B
ADC C
ADC D
ADC E
ADC H
ADC L
ADC M
ADC A
SUB B
SUB C
SUB D
SUB E
SUB H
SUB L
SUB M
SUB A
SBB B
SBB C
SBB D
SBB E
SBB H
SBB L
SBB M
SBB A
ANA B
ANA C
ANA D
ANA E
ANA H
ANA L
ANA M
ANA A
XRA B

AC
AD
AE
AF
B0
B1
B2
B3
B4
B5
B6
B7
B8
B9
BA
BB
BC
BD
BE
BF
C0
C1
C2
C3
C4
C5
C6
C7
C8
C9
CA
CB
CC
CD
CE
CF
D0
D1
D2
D3

XRA H
XRA L
XRA M
XRA A
ORA B
ORA C
ORA D
ORA E
ORA H
ORA L
ORA M
ORA A
CMP B
CMP C
CMP D
CMP E
CMP H
CMP L
CMP M
CMP A
RNZ
POP B
JNZ ADDR
JMP ADDR
CNZ ADDR
PUSH B
ADI D8
RST 0
RZ
RET
JZ ADDR
CZ ADDR
CALL Addr
ACI D8
RST 1
RNC
POP D
JNC ADDR
OUT D8

D7
D8
D9
DA
DB
DC
DD
DE
DF
E0
E1
E2
E3
E4
E5
E6
E7
E8
E9
EA
EB
EC
ED
EE
EF
F0
F1
F2
F3
F4
F5
F6
F7
F8
F9
FA
FB
FC
FD
FE

RST 2
RC
JC ADDR
IN D8
CC ADDR
SBI D8
RST 3
POR
POP H
JPO ADDR
XTHL
CPO ADDR
PUSH H
ANI D8
RST 4
RPE
PCHL
JPE ADDR
XCHG
CPE ADDR
XRI D8
RST 5
RP
POP PSW
JP ADDR
DI
CP ADDR
PUSH PSW
ORI D8
RST 6
RM
SPHL
JM ADDR
EI
CM ADDR
CPI D8

Captulo 8 Arquitetura de processadores


28
29
2A

DAD H
LHLD ADDR

53
54
55

MOV D,E
MOV D,H
MOV D,L

7E
7F
80

MOV A,M
MOV A,A
ADD B

8-23
A9
AA
AB

XRA C
XRA D
XRA E

D4
D5
D6

CNC ADDR FF
PUSH D
SUI D8

RST 7

Observe que alguns cdigos, ao serem recebidos pelo processador, no


representam instruo alguma. No caso do 8080, esses cdigos so:
08, 10, 18, 20, 28, 30, 38, CB, D9, DD, ED e FD.
Ao encontrar uma dessas instrues invlidas, o 8080 no fazia nada. Alguns
ciriosos descobriram que certos cdigos invlidos eram na verdade instrues
no documentadas da Intel, porm nenhum programador srio ousava
utiliz-las. Como eram instrues no oficiais, no era garantido que fossem
implementadas em todas as verses do processador. No 8085, uma evoluo
do 8080, a Intel utilizou duas novas instrues: RIM (20h) e SIM (30h). A
Zilog utilizou esses cdigos para usar com as novas instrues do seu
processador Z80.
Nos processadores modernos, no permitido executar instrues invlidas.
Quando isso ocorre, o prprio processador gera uma interrupo e indica
operao ilegal. No Windows, isso resulta em uma mensagem como: Erro o
programa xxxx executou uma operao ilegal em .....

Linguagem Assembly do 8086


Depois desta breve apresentao do assembly do processador 8080, estamos
finalmente entrando na era dos PCs, com o assembly do processador 8086.
Os seus registradores internos so de 16 bits, mas foram inspirados nos
registradores do 8080. Na figura 7, os registradores indicados em branco so
herdados do 8080, enquanto os indicados em cinza so novos, prprios do
8086.

8-24

Hardware Total
Figura 8.7
Registradores
8086.

internos

do

Os regisradores AX, BC, CX e DX so de 16 bits, mas podem ser tratados


como duas partes de 8 bits. AX dividido em AH e AL, BX dividido em
BH e BL, e assim por diante. AX o acumulador, portanto AL corresponde
ao registrador A do 8080. O registrador BX do 8086 corresponde ao par HL
do 8080 (assim como BH corresponde a H e BL corresponde a L). Da
mesma forma, CX corresponde ao par BC e DX corresponde ao par DE. O
contador de programa (PC) do 8080 chamado no 8080 de IP (Instruction
Pointer). O Stack Pointer (SP) similar, e os flags (Cy, Z, AC, P e S) ficam
em um registrador de flags, com 16 bits.
Esta correspondncia entre os registradores do 8086 e do 8080 foi proposital.
Permitiu que programas escritos em assembly do 8080 fossem rapidamente
convertidos para o 8086, mesmo que no da forma mais eficiente. Por
exemplo, as instrues MOV D,B / MOV E,C podiam ser diretamente
traduzidas por MOV DH,CH / MOV DL,CL. Entretanto muito melhor
usar os recursos de 16 bits, com a instruo MOV DX,CX. Depois de
converter os antigos programas assembly de 8080 para 8086, os produtores
de software passaram a criar programas novos j usando os recursos mais
avanados do 8086, resultando em programas mais eficientes. Programas em
linguagem de alto nvel (C, Pascal, etc.) podiam ser convertidos com mais
facilidade, j que eram desvinculados do assembly.
Novas instrues

Alm de ter todas as instrues do 8080 ou instrues similares, o 8086


trouxe novas instrues bem mais avanadas, com execuo mais rpida.
Alguns exemplos:

Captulo 8 Arquitetura de processadores

8-25

Multiplicaco de nmeros inteiros de 16 bits


Diviso de nmeros inteiros de 32 bits
Rotaes com qualquer nmero de bits
Movimentao e comparao de strings
Instrues para manipulao direta de bits
Instrues de repetio

Registradores BX, BP, SI e DI

Esses registradores permitem vrias operaes comuns em outros


registradores, e alm delas, podem ser usados como ndices. Por exemplo,
podemos us-los para apontar posies de memria usando expresses como:
[BX+valor]
[BP+valor]
[SI+valor]
[DI+valor]

[BX+SI+valor]
[BX+DI+valor]
[BP+SI+valor]
[BP+DI+valor]

Exemplos:
MOV BX,1000h
MOV AL,[BX+15h]
MOV BX,2000h
MOV SI,100h
MOV AL,[BX+SI+20h]

; Aponta para o endereo 1000h


; L para AL o valor que est em 1015h
; L para AL o valor que est em 2120h

O uso de ndices torna a programao extremamente mais simples quando


temos que lidar com estruturas de dados na memria, como strings e
matrizes.
Registradores de segmento

O 8086 podia enderear 1 MB de memria, muito mais que os 64 kB


permitidos pelo 8080. No 8080, toda a memria era tratada como uma nica
coleo de bytes, contendo instrues, dados e stack. No 8086, esses
elementos tambm ficam nesta mesma memria, apesar de maior. Apesar da
memria ser homognea do ponto de vista fsico, seu uso dividido em
reas chamados segmentos. Instrues devem ficar no segmento de cdigo,
dados devem ficar no segmento de dados ou no segmento extra, e a stack
deve ficar no segmento de stack. Para manter essas 4 reas de memria
diferentes, o 8086 possui 4 registradores de segmento, que so:
CS: Code segment

8-26

Hardware Total

DS: Data segment


ES: Extra segment
SS: Stack segment
Cada segmento no 8086 uma rea de memria com 64 kB. Os
registradores de segmento indicam o endereo inicial dos respectivos
segmentos. Note que esses registradores tm 16 bits, enquanto os endereos
de memria do 8086 tm 20 bits. O processador obtm o endereo inicial de
cada segmento adicionando 4 bits zero (ou um dgito 0 hexadecimal)
direita do valor existente no regitrador de segmento. Por exemplo, se o
registrador CS est com o valor 7BC3, ento o segmento de dados comea
no endereo 7BC30.
Figura 8.8
Regitradores de segmento indicam os
incios dos respectivos segmentos.

A figura 9 mostra como feito o endereamento da memria dentro de um


segmento. Todos os acessos a instrues so feitas automaticamente no
segmento de dados. Digamos que CS esteja armazenando o valor 2800h, o
que indica que o segmento de dados comea em 28000h. Digamos que o
registrador IP (Instriction Pointer) esteja com o valor 0153h. Para obter o
endereo de memria, fazemos a seguinte conta: adicionar um zero direita
do valor do segmento e somar este resultado com o offset, que no caso o
valor de IP. Encontramos ento 28000h+0153h=28153h.

Captulo 8 Arquitetura de processadores

8-27
Figura 8.9
Determinao de um endereo absoluto a
partir do segmento e do offset.

Todos os endereos do 8080 so compostos desta forma. O endereo usado


para acessar a memria (de 00000 a FFFFF) o que chamamos de endereo
absoluto. O endereo absoluto sempre formado por um valor de segmento
e um offset. O valor do segmento adicionado de um zero hexadecimal
sua direita e somado com o valor do offset, resultando no endereo absoluto.
Vejamos um outro exemplo. Digamos que tenhamos DS=8A9Fh e
BX=7CB6h. A instruo MOV AL,[BX] buscar um byte do endereo
absoluto dado por:
8A9F0h +7CB6h = 926A6h
Observe que cada posio de memria pode ser endereada de vrias outras
formas. Por exemplo, o mesmo endereo absoluto 926A6H pode ser obtido
fazendo DS=9000h e BX=26A6h.
Todas as instrues a serem executadas so buscadas no segmento de
cdigo, portanto o registrador CS usado na determinao do endereo
absoluto. Todos os acessos a dados so feitos no segmento de dados,
portanto o processador usa o valor de DS no clculo do endereo absoluto.
Certas instrues que manipulam strings utilizam o segmento extra (ES a
base para o clculo), e as operaes com a stack so feitas no segmento de
stack, determinado por SS.
Usando 4 segmentos de 64kB (cdigo, dados, stack e extra), somos levados a
concluir erradamente que um programa de 8086 pode ter no mximo 64 kB.
Na prtica no isso o que ocorre. Para programas pequenos, no
necessrio usar integralmente os 64 kB de cada segmento, portanto pode

8-28

Hardware Total

ocorrer interseo entre os segmentos. Alm disso, instrues especiais


alteram automaticamente o valor de CS em operaes de desvio e chamadas
de rotinas, resultando em programas de maior tamanho, podendo at mesmo
usar toda a memria disponvel. Um mesmo programa pode ter mltiplos
segmentos de cdigo e de dados, manipulando assim quantidades maiores
de memria.
Modos de endereamento

O 8086 possui vrios modos de endereamento:


Imediato: Opera com valores constantes. Exemplos:
MOV AX,0
MOV BX,1000h
MOV DL,20h
MOV SI,3500h

; Carrega AX com 0
; Carrega BX com 1000h
; Carrega DL com 20h
; Carrega SI com 3500h

Registrador: Quando envolve apenas registradores. Exemplos:


MOV AX,BX
MOV CX,SI
MOV DS,AX
OR BX,CX

; Copia BX em AX
; Copia SI em CX
; Copia AX em DS
; Faz um OR de BX com CX. Resultado fica em BX

Direto: Qundo faz referncia a um endereo fixo de memria. Exemplos:


MOV AX,[1000h]
ADD CX,[2000h]
CMP SI,[1020h]

; Carrega o valor do endereo 1000h em AL e do endereo 1001h em AH


; Carrega o valor de 16 bits dos endereos 2000h/2001h em CX
; Carrega o valor de 16 bits dos endereos 1020h/1021h em SI

Indexado: Este o modo de endereamento mais flexvel. Usa os


registradores BX, BP, SI e DI como ndices. Os ndices podem ser usados
sozinhos ou combinados, ou seja, o valor da soma de BX ou BP com SI ou
DI. Sobre este valor ainda pode ser adicionada uma constante. Exemplos:
MOV CL,[BX]
MOV DL,[BP]
MOV AX,[SI]
MOV AH,[DI]
MOV CX,[BX+5]
MOV DL,[BP+50]
MOV AL,[SI+100]
MOV AX,[DI+1200]
MOV AX,[BX+SI]
MOV CL,[BX+SI+200]
MOV AH,[BP+DI]
MOV DX,[BP+DI+300]
MOV CX,[DI+4800]

Captulo 8 Arquitetura de processadores

8-29

MOV DX,[BP+SI]
MOV AH,[BP+SI+2000]
MOV AL,[BP+DI]
MOV DX,[BP+DI+700]

Note que no permitido usar em uma nica instruo, dois


endereamentos memria. Por exemplo, no podemos usar MOV [SI],[DI].
Apesar disso podemos mover dados entre quaisquer resitradores e quaisquer
formas de endereamento da memria (coisa que no era permitida no
8080). No caso do 8086, existem algumas raras excees. Por exemplo, no
podemos usar livremente os registradores de segmento com todas as
operaes que so suportadas pelos demais registradores. No podemos
usar, por exemplo, ADD DS,AX. Os registradores de segmento permitem
apenas instrues de movimentao de dados.
Instrues de movimentao de dados

MOV: Move dados entre dois locais quaisquer. Podem ser usados nesta
instruo, qualquer um dos modos de endereamento j citados. Exemplos:
MOV AX,BX
MOV DI,1000h
MOV [BX+SI],20
MOV CL,19
MOV SI,[BX]
MOV [BP+DI],CX

Note que o 8086 no tem instrues equivalentes a STAX e LDAX do 8080,


que usam pares BC e DE para indexar a memria, j que no existem os
modos de endreamento [CX] e [DX].
XCHG: No 8080 esta instruo permutava os valores de DE e HL. No 8086,
quaisquer valores podem ser permutados, o que engloba todos os
registradores e a memria, endereada por todos os modos vlidos.
permitido inclusive us-la com elementos de 8 bits. Exemplos:
XCHG BX,DX
XCHG AX,SI
XCHG AL,BH
XCHG CX,[BX+SI]

XLAT: Esta uma instruo bastante especializada. til para implementar


tradues de cdigos. Digamos que tenhamos na memria uma tabela de
256 valores, e queremos obter o valor desta tabela, cujo ndice est em AL.
A instruo XLAT faz isso, uma operao equivalente a MOV AL,[BX+AL].

8-30

Hardware Total

Instrues aritmticas

NEG: Inverte o sinal do valor aritmtico especificado. Se o nmero for


positivo, tornar-se-a negativo, e vice-versa. Note que nmeros negativos
necessitam de um bit (o mais significativo) para indicar o sinal, e os demais
para indicar a magnitude. Nmeros com sinal armazenados em 8 bits podem
portanto variar entre 128 e +127. Com 16 bits, variam entre 32.768 e
+32.767.
NEG AL
NEG AX
NEG BX
NEG DX
NEG byte ptr [BX+SI]
NEG word ptr [DI+4]

Estamos apresentando agora os prefixos byte ptr e word ptr. Esses prefixos
so utilizados para informar ao assembler a real inteno do programador, se
acessar um dado de 8 ou de 16 bits. Por exemplo, na instruo MOV AL,
[BX], o assembler sabe que o valor da memria a ser acessado de 8 bits, j
que o outro operando AL, que tambm de 8 bits. J em instrues como
NEG [BX], o assembler no saberia se a operao deve ser feita sobre o byte
cujo endereo dado por BX, ou se deve operar sobre os dois bytes (word)
com este endereo. Usamos ento os prefixos byte ptr e word ptr quando
necessrio para dar esta informao ao assembler.
ADD, ADC: Soma os dois operandos. O resultado colocado no primeiro
operando. A operao pode ser feita com 8 ou 16 bits, dependendo do
operando. A instruo ADC soma os dois valores com o bit Carry, o que
usado para fazer o vai 1, agrupando dados de 16 bits para formar dados
com maior nmero de bits. Exemplos:
ADD BX,SI
ADD AX,[BX+DI]
ADD CL,AH
ADD DX,CX
ADD [SI],DX
ADC CX,[BX+SI]
ADC AH,[BP+SI+3]
ADC DX,BX
ADC [SI],AX

SUB, SBB: Essas duas instrues utilizam os mesmos operandos das


instrues ADD e ADC. Fazem a subtrao de valores. A diferena entre
elas que a SBB subtrai tambm o valor do bit Carry, tornando possvel a
operao de pedir emprestado, o que necessrio para agrupar vrios

Captulo 8 Arquitetura de processadores

8-31

dados de 16 bits, manipulando assim nmeros inteiros com maior nmero de


bits. Exemplos:
SUB BX,DX
SUB CX,[BP+DI]
SUB CH,DL
SUB CX,AX
SUB [SI],BX
SBB AX,[BX+DI]
SBB CX,[BP+SI+3]
SBB CX,AX
SBB [SI],CX

MUL, IMUL: So as duas instrues de multiplicao do 8086. Ambas


podem operar com 8 e 16 bits. A diferena que MUL usada para
nmeros sem sinal, somente positivos, enquanto IMUL aceita nmeros
inteiros, sejam positivos ou negativos. Nesta multiplicao, um dos fatores
sempre AX ou AL. O outro fator pode ser qualquer operando na memria
ou um outro registrador, com 8 ou 16 bits. Ao multiplicarmos dois valores de
8 bits, o resultado armazenado nos 16 bits de AX. Ao multiplicarmos dois
valores de 16 bits, o resultado armazenado em 32 bits, ficando os 16 menos
significativos em AX e os 16 mais significativo em DX. Exemplos:
MUL CL
MUL BX
MUL byte ptr [SI]
IMUL DX
IMUL BX
IMUL CL

DIV, IDIV: So as instrues de diviso. O dividendo pode ser de 16 ou 32


bits. Se for de 16 bits, usado o valor de AX. Se for de 32 bits, usado o
valor obtido em DX e AX. O que definir se o dividendo ser de 16 ou 32
bits o divisor. Se o divisor for de 8 bits, ser considerado como dividendo,
AX, o quociente ficar em AL e o resto em AH. Se o divisor for de 16 bits,
ser considerado como dividendo o nmero de 32 bits formado por DX e
AX. O quociente ficar em AX e o resto em DX.
Note que esta instruo parte do princpio de que o resultado caber no
registrador destinado ao quociente. Se no couber, ocorrer um erro
chamado estouro de diviso (divide overflow). Por exemplo, ao fazer a
conta 8000h dividido por 2, usando um divisor de 8 bits, o resultado ser
4000h, que no cabe em 8 bits. Para no passar por este problema melhor
fazer a mesma conta usando o divisor 2 com 16 bits (MOV CX,2 / DIV CX).
Assim como ocorre nas instrues MUL e IMUL, a instruo DIV opera

8-32

Hardware Total

apenas com nmeros inteiros positivos, e a IDIV opera tanto com positivos
quanto com negativos.
INC, DEC: Incrementa de uma unidade e decrementa de uma unidade. Os
bits Carry e Zero so afetados por essas operaes, portanto podem ser
usadas para implementar contadores. Por exemplo, para preencher a tela de
um terminal de vdeo com 2000 caracteres em branco, podemos usar o
seguinte trecho de programa:
ENVIA:

MOV DX,2000
MOV AL, 20h
CALL OUTCHAR
DEC DX
JNZ ENVIA

; Nmero de bytes a serem enviados


; 20h o cdigo do caracter espao.
; Envia o caracter para o terminal de video
; Decrementa o contador
; Pula se no chegou a zero

Alm de implementar contadores, as instrues INC e DEC tambm podem


ser usadas para implementar ponteiros para posies de memria, o que e
til quando queremos manipular dados seqenciais.
Instrues lgicas

NOT: Inverte todos os bits do dado especificado. Cada bit 1 se transforma


em 0, e cada bit 0 se transforma em 1. Exemplos:
NEG AX
NEG SI
NEG DL
NEG byte ptr [BX]
NEG word ptr [BP+DI]
NEG byte ptr [1000h]

AND, OR, XOR: So os tradicionais operadores lgicos E, OU e OU


Exclusivo. No h necessidade de apresentar novamente a tabela verdade
desses operadores, j mostradas quando apresentamos as instrues do 8080.
A diferena aqui que essas operaes podem ser feitas com 8 ou 16 bits, e
os dois operandos podem ser quaisquer, desde que ambos sejam do mesmo
tipo (ou ambos so byte, ou ambos so word). O resultado da operao
ficar armazenado no primeiro operando.
AND AX,SI
AND CX,[BX+DI]
AND DL,CH
OR [SI],AL
OR AX,1040h
OR byte ptr[SI],20h
XOR BX,DX
XOR [SI+2],AL
XOR AL,AH

Captulo 8 Arquitetura de processadores

8-33

Shifts e Rotates

O 8086 tem diversas instrues para deslocar bits para a esquerda e para a
direita. So chamadas de shifts e rotates. As instrues SHL e SHR so
exemplos de shifts. Provocam o deslocamento de todos os bits para a
esquerda e para a direita, respectivamente. Bits 0 so introduzidos direita e
esquerda. A operao dessas duas instrues mostrada na figura 10. Note
que no 8086, qualquer registrador ou posio de memria pode ser usada
com esta instruo. Podemos aplicar um deslocamento de um s bit ou de
mltiplos bits, como mostraremos mais adiante.
Figura 8.10
Instrues SHL e SHR.

A diferena entre um shift e um rotate que o shift introduz um bit 0 ou 1


no no bit mais ou no bit menos significativo, como o caso das instrues
SHL e SHR mostradas na figura 10. Uma instruo de rotate forma uma
espcie de anel, na qual o bit que sai em uma extremidade recolocado
na otura extremidade. A figura 11 mostra as instrues ROL e ROR (rotate
left e rotate right). O exemplo da figura mostra a rotao de valores de 8 bits,
mas tambm podem ser usados operandos de 16 bits. Note que na instruo
ROL, o bit 7 realimentado no lugar do bit 0. Na instruo ROR o bit 0
realimentado no lugar do bit 7. Em ambas as instrues, o bit que
realimentado tambm copiado no Carry. Este mtodo de rotao o
mesmo das instrues RLC e RRC do 8080.
Figura 8.11
Instrues ROL e ROR.

8-34

Hardware Total

As instrues RCL e RCR operam de forma similar, exceto pelo fato do bit
Carry fazer parte da rotao, ao invs de simplesmente ficar com uma cpia
do bit realimentado. A figura 12 mostra o funcionamento dessas duas
instrues, que so exemplos de rotates. Este o mesmo mtodo de rotao
usado pelas instrues RAL e RAR do 8080.
Figura 8.12
Instrues RCL e RCR.

Finalmente apresentamos as instrues SAL e SAR, que tambm so shifts,


da mesma forma como as instrues SHL e SHR j apresentadas. Note que
deslocar os bits uma posio para a esquerda, introduzindo zeros, equivale a
multiplicar o valor por 2, e deslocar os bits uma posio para a direita
equivale a dividir o valor por 2. Isto funciona para nmeros positivos, mas
quando os nmeros podem ter sinal (o sinal representado pelo bit mais
significativo; 1 significa negativo e 0 significa positivo), preciso que as
instrues de shift preservem este sinal. Para isso servem as instrues SAL e
SAR, que so chamados shifts aritmticos (assim como SHR e SHL so
chamados shifts lgicos). O funcionamento dessas duas instrues
mostrado na figura 13.
Figura 8.13
Instrues SAL e SAR.

A instruo SAL idntica instruo SHL, com a introduo de zeros. J a


instruo SAR tem uma diferena. Ao invs de serem introduzidos zeros no
bit mais significativo, este realimentado em si prprio, ou seja, copiado
para o bit seguinte mas o seu prprio valor permanece inalterado. Esta

Captulo 8 Arquitetura de processadores

8-35

alterao permite que nmeros negativos continuem negativos ao serem


deslocados para a direita (ou seja, divididos por 2).
Alm da maior variedade de instrues de shifts e rotates, o 8086 permite
operar no apenas com o acumulador, mas com qualquer outro registrador
(exceto registradores de segmento), de 8 ou 16 bits. Tambm pode operar
com posies de memria, de 8 ou 16 bits. Uma outra diferena importante
que o deslocamento pode ser feito apenas uma posio (como
exemplificado nas figuras), ou com mltiplas posies. Por exemplo,
podemos deslocar um valor 3 bits para a esquerda, o que equivale a usar 3
vezes consecutivas a mesma instruo. Para aplicar shifts e rotates mltiplos,
basta carregar no registrador CL, o nmero de vezes que os bits devem ser
deslocados. Exemplos:
SHR AX,1
MOV CL,4
ROR BX,CL
SHL DL,1

; Aplica um shift para a esquerda em AX, de 1 bit.


; Prepara CL com o nmero de bits a serem deslocados
; Roda BX 4 bits para a direita
; Aplica um shift em DL de 1 posio para a esquerda

Desvios

As instrues de CALL, RET e JMP presentes no 8080 tambm esto


presentes no 8086. Tambm temos as formas condicionais da instruo JMP,
mas no temos formas condicionais das instrues CALL e RET. Por
exemplo, no existe a instruo RC (Return if Carry), como no 8080. No seu
lugar temos que fazer uma combinao das instrues JNC e RET.
As formas condicionais da instruo JMP esto representadas na tabela que
se segue:

8-36

Hardware Total

Note que muitas instrues possuem aliases, ou seja, sinnimos. Por


exemplo, pule se menor ou igual a mesma coisa que pule se no
maior, portanto existem duas instrues idnticas: JBE e JNA (jump if below
or equal / jump if not above).
Uma outra instruo interessante LOOP. Esta instruo faz o seguinte:
decrementa o valor de CX, e se este registrador no chegou a zero, faz o
desvio para um label especificado. Por exemplo:

TRANSF:

MOV CX,10
MOV SI,1000
MOV DI,2000
MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
LOOP TRANSF

; Contador para 10 vezes


; SI aponta para endereo 1000 da memria
; DI aponta para 2000
; Pega um byte da origem
; Guarda no destino
; Incrementa ponteiros
; Decrementa CX e se no chegou a zero vai para TRANSF

Neste pequeno trecho de programa as 4 instrues MOV AL,[SI] / MOV


[DI],AL / INC SI / INC DI ser executado 10 vezes, que o valor inicial do
contador CX. Observe que este exemplo meramente explicativo, j que
existe uma nica instruo que faz tudo isso sozinha (REP MOVS), como
veremos mais adiante. O objetivo deste exemplo foi mostrar como a
instruo LOOP pode ser usada para implementar repeties.
Existem ainda as formas condicionais da instruo LOOP, que so LOOPE e
LOOPNE (ou LOOPZ e LOOPNZ). Essas instrues fazem previamente um

Captulo 8 Arquitetura de processadores

8-37

teste no bit Zero, e executao uma instruo LOOP caso a condio seja
satisfeita. Se a condio no for satisfeita, o loop ser terminado. Podemos
usar os loops condicionais para fazer uma comparao ou finalizar uma
contagem antes imediatamente antes do final do loop, permitindo assim que
o loop possa ser finalizado mesmo que o contador no tenha chegado a zero.
Existe ainda a instruo JCXZ (jump if CX=0). Como o nome j diz, esta
instruo executa um desvio caso o valor de CX tenha atingido o valor zero.
Note que esta instruo, a instruo LOOP e suas formas condicionais, e as
instrues de shifts e rotates que podem usar em CL o nmero de bits a
serem deslocados, do ao registrador CX uma espcie de personalidade.
Este registrador usado como contador em todas essas instrues citadas, e
em outras que ainda vamos apresentar.
Rotinas e retornos

Como j abordamos, as instrues de chamadas e retornos de rotinas so


CALL e RET, e no possuem formas condicionais. Existem entretanto outras
instrues de chamadas e retornos.
A instruo INT uma espcie de interrupo de software. Normalmente
usada para servios do sistema operacional. Os primeiros 1024 bytes da
memria so reservados para uma rea chamada vetor de interrupes. Este
vetor tem 256 elementos, e cada um desses elementos composto de 4
bytes, sendo 2 para indicar um segmento e 2 para indicar um offset. Cada
um desses 256 elementos o endereo de uma funo do sistema
operacional encarregada de um determinado servio. Cabe ao produtor do
sistema operacional estipular como essas 256 interrupes sero usadas. Por
exemplo, no MS-DOS, a instruo INT 21h usada para vrias chamadas de
funes bsicas de acesso a disco e E/S em geral.
Quando uma instruo CALL executada, o endereo de IP armazenado
na stack. A operao inversa feita pela instruo RET. Quando uma
instruo INT executada, os valores de CS e IP so armazenados na stack,
j que sero carregados com novos valores encontrados no vetor de
interrupes. O final de uma rotina de interrupo, seja ela de software ou
de hardware, tem que terminar com uma instruo IRET. A diferena que
IRET obtm da stack, valores de CS e IP, enquanto uma instruo RET
comum obtm apenas o valor de IP.
Manipulao da stack

8-38

Hardware Total

As instrues PUSH e POP so utilizadas respectivamente para armazenar e


recuperar valores de 16 bits na pilha. Todos os registradores de 16 bits
podem ser usados com essas instrues, bem como dados de 16 bits da
memria. As instrues PUSHF e POPF so usadas para salvar e recuperar o
registrador de flags. Exemplos:
PUSH BX
PUSH SI
PUSH BP
PUSH DS
POP AX
POP CX
POPF

Interrupes e E/S

Vrias instrues so usadas para o processador interagir com o hardware.


As instrues STI e CLI so hadas para habilitar e desabilitar interrupes.
Instrues IN e OUT fazem operaes de entrada e sada com 8 ou 16 bits.
Nas instrues de 8 bits usado o registrador AL, e nas instrues de 16 bits
usado o registrador AX. Exemplos:
IN AL,80h
IN AX,60h
OUT 43h,AL
OUT 40h,AX

; L porta de 8 bits no endereo 80h


; L porta de 16 bits no endereo 60h
; Envia dado de AL para a porta 43h
; Envia AL para a porta 40h e AH para a porta 41h

Usadas neste modo, as instrues IN e OUT permitem enderear portas na


faixa de endereos de 00 a FF. Para enderear portas em todo o espao de
endereamento do processador (0000 a FFFF) preciso colocar em DX o
endereo da porta a ser acessada. Exemplos:
MOV DX,3F0h
IN AL,DX
MOV DX,278h
OUT DX,AL

; DX aponta para a porta 3F0


; L o valor da porta 3F0
; Aponta para a porta 278h
; Envia dado de AL para a porta 278h

Manipulao de strings

O processador 8086 e seus sucessores tm a capacidade de manipular strings,


que so cadeias de caracteres. Essas funes so importantes em
processadores de texto e compiladores. Em todas as instrues de strings, os
registradores SI e DI apontam para as strings envolvidas. SI aponta para a
origem, localizada no segmento de dados. DI aponta para a string destino,
localizada no segmento Extra. Portanto as strings de origem e destino esto
em CS:SI e ES:DI, respectivamente. O registrador CX usado como

Captulo 8 Arquitetura de processadores

8-39

contador, e AL ou AX so usados para manter o dado nas operaes de


busca, leitura e escrita.
MOVSB e MOVSW Move um dado (8 ou 16 bits) da origem para o
destino. MOVSB opera com bytes, e equivalente seguinte seqncia:
MOV dado8,DS:[SI]
MOV ES:[DI],dado8
INC SI
INC DI

MOVSW opera com dados de 16 bits, e equivalente seqncia


MOV dado16,DS:[SI]
MOV ES:[DI],dado16
ADD SI,2
ADD DI,2

Se quisermos que seja movido um certo nmero de bytes, podemos usar um


contador e decrement-lo aps a instruo MOVSB ou MOVSW, e voltar
instruo se o contador no chegou a zero. Podemos usar a instruo LOOP
para este fim, que decrementa CX e faz o desvio caso no tenha chegado a
zero. Melhor ainda, podemos usar o prefixo REP antes da instruo. Para
usar este prefixo, carregamos em CX o nmero de vezes que a instruo
deve ser executada. Usamos ento essas instrues nas formas:
REP MOVSB
REP MOVSW

Observe que o prefixo REP faz com a que a instruo seguinte seja
executada CX vezes, mas este prefixo s pode ser usado em operaes com
strings.
Outras operaes com strings so:
LODSB e LODSW: Carrega em AL ou AX o dado apontado por DS:SI. O
registrador SI incrementado de 1 ou 2 unidades dependendo de ser a
operao de 8 ou 16 bits.
STOSB e STOSW: Armazena AL ou AX em ES:DI. O registrador DI
incrementado de 1 ou 2 unidades para operaes de 8 ou 16 bits,
respectivamente. Aliado ao prefixo REP, essas instrues permitem
preencher uma rea de memria com um valor constante.

8-40

Hardware Total

SCASB e SCASW: Compara AL ou AX com o valor da memria apontado


por ES:DI. O registrador DI somado com 1 ou 2 para operaes de 8 ou
16 bits. O flag Zero ligado de acordo com o resultado da comparao,
portanto logo aps uma instruo SCASB ou SCASW podemos usar um
desvio condicional para indicar se o valor de AL ou AX foi encontrado ou
no na memria.
CMPSB e CMPWS: Compara os dados apontados por DS:SI e ES:DI. Os
flags so ligados de acordo com a comparao, portanto podemos usar
depois dessas instrues, um desvio condicional. Os ponteiros SI e DI so
atualizados. Essas instrues permitem achar uma string dentro de uma rea
de memria. o que ocorre quando usamos em um processador de textos, o
comando Localizar.
Outras instrues

O 8086 tem muitas outras instrues. Optamos por no apresentar todas aqui
para no tornar o captulo muito complexo. Voc pode obter no site da Intel
(www.intel.com), o manual completo da linguagem assembly dos
processadores modernos. A diferena que existem novas instrues,
sobretudo aquelas para manipular valores de 32 bits. Mesmo no sendo
totalmente completa, esta apresentao resumida atendeu ao nosso objetivo
de mostrar como o processador opera internamente e como os programas
so executados.

Arquitetura do 80286
O 80286 tambm um processador de 16 bits. Possui os mesmos
registradores internos existentes no 8086. Entretanto possui algumas novas
instrues, bem como um novo modo de endereamento capaz de operar
com 16 MB de memria, o que era uma quantidade espantosa para a poca
do seu lanamento (1982), quando a maioria dos computadores tinha 64 kB
de memria. O 80286 podia operar em duas modalidades. O chamado
modo real (8086 real address mode) permite enderear at 1 MB de
memria. Nesse caso o processador comporta-se como um 8086, apenas
acrescido de algumas novas instrues. Para uso em sistemas operacionais
mais avanados, o 80286 podia operar no modo protegido (protected virtual
address mode). Neste modo, o processador pode operar com 16 MB de
memria fsica e at 1 GB de memria virtual por tarefa.
Multitarefa

O 80286 foi criado visando facilitar a multiprogramao ou multitarefa, na


qual vrios programas podem ser executados simultaneamente. O que

Captulo 8 Arquitetura de processadores

8-41

ocorre uma diviso do tempo entre os vrios processos que esto sendo
executados. Uma forma simples de dividir o tempo alocar perodos iguais
(10 milsismos de segundo, por exemplo), e distrubuir esses perodos entre
os processos. Quando um processo comea a ser executado, ser
interrompido 10 ms depois, e o sistema operacional deve fazer com que o
processador d ateno ao processo seguinte. Desta forma usando um
esquema de rodzio, todos os processos so executados ao mesmo tempo,
porm em cada instante um s est efetivamente em execuo, e os demais
esto aguardando. O perodo no qual o processador est dedicado a um
processo chamado time slice.
Existem outros esquemas mais sofisticados para implementar a multitarefa.
Processos podem ter prioridades diferentes e time slices diferentes, visando
aumentar a eficincia. Um processo que faz muitas operaes de E/S tende a
no utilizar integralmente seu time slice, j que freqentemente precisa parar
e aguardar pela operao de E/S (a leitura de um arquivo do disco, por
exemplo). Este tipo de processo classificado como I/O bounded. Por
outro lado, processos que fazem poucas operaes de E/S e realizam muito
processamento so chamados de CPU bounded. Esses processos tendem a
utilizar integralmente o seu time slice. Visando aumentar a eficinica, o
sistema operacional pode reduzir o time slice e aumentar a prioridade para
os processos I/O bounded. Pode ainda aumentar o time slice e reduzir a
prioridade para os processos CPU bounded. Enfim, o sistema operacional
pode alterar as prioridades e a durao do time slice para que o trabalho do
processador seja distribudo uniformemente entre os vrios processos.
Novas instrues do 80286

As novas instrues incorporadas a este processador podem, em sua maioria,


ser utilizadas tanto no modo real como no modo protegido. Apenas como
referncia rpida, citaremos algumas delas:
PUSHA e POPA: Realizam operaes de PUSH e POP com todos os
registradores do processador. Essas instrues tornam mais rpida a
operao de salva e restaurao de contexto, necessria nas entradas e sadas
de rotinas e nas mudanas entre uma tarefa e outra.
IMUL: No 8086 esta instruo fazia a multiplicao de AL ou AX por um
registrador de 8 ou 16 bits. No 80286, esta instruo tambm pode operar
com valores constantes. Por exemplo, se quisermos multiplicar AX por 38,
basta usar IMUL AX,38. No 8086 era preciso usar algo como MOV CX,38 /
IMUL CX.

8-42

Hardware Total

Shifts e Rotates: No 8086 essas operaes eram feitas com 1 bit ou com
mltiplos bits, mas era preciso carregar em CL o nmero de bits a serem
deslocados. No 80286 o valor pode ser usado diretamente na instruo. Por
exemplo: SHR AX,3
INSB, INSW, OUTSB, OUTSW: So verses mais avanadas das
instrues IN e OUT. Agora essas instrues operam com strings. Portanto
possvel, por exemplo, enviar para um endereo de E/S uma seqncia de
dados da memria. O prefixo REP e o contador CX podem ser usados para
especificar o nmero de transferncias a serem realizadas.
ENTER e LEAVE: Essas novas instrues so usadas para implementar
rotinas em linguagens de alto nvel. A instruo ENTER cria o que
chamamos de stack frame, no qual ficam armazenados parmetros e
variveis locais da rotina. A instruo LEAVE realiza o proceso inverso.
Essas duas novas instrues tornaram o uso de rotinas em assembly mais
adequado ao mtodo usado pelas linguagens de alto nvel, alm de permitir
uma entrada e sada mais rpida das rotinas.
BOUND: Essa instruo checa se o ndice de um array est entre os limites
mximo e mnimo permitidos pelo array. O array nada mais que um vetor
na memria. Por exemplo, se temos um array A com ndices de 0 a 10, seus
elementos so A[0], A[1], A[2], .... , A[10]. Se tentarmos usar uma expresso
como A[30], um programa em linguagem de alto nvel dever ser suspenso
com a apresentao da mensagem de erro Invalid index. Certas linguagens
no testam ndices invlidos e cabe ao programador garantir que o ndice
vlido. Outras linguagens monitoram os ndices durante a execuo, mas isto
resulta em mais tempo gasto. A instruo BOUND permite fazer a checagem
dos ndices em tempo de execuo, de forma mais rpida.
Instrues para o modo virtual: O 80286 possui vrias instrues que
servem para que o sistema operacional faa o gerenciamento da memria e
das tarefas quando opera em modo protegido.
Modo real

Visando manter compatibilidade com os programas escritos para 8086/8088,


o 80286 capaz de operar no chamado modo real. O processador passa a se
comportar como um 8086, endereando apenas 1 MB de memria. apenas
acrescido das novas instrues adicionadas ao conjunto de instrues
originais do 8086, exceto aquelas usadas para gerenciamento de tarefas. Por
isso quase certo dizer que o 80286 operando em modo real equivalente
ao 8086. Alguns dizem que isso o mesmo que um XT. mais ou menos

Captulo 8 Arquitetura de processadores

8-43

isso o que acontece, mas devemos lembrar que o 8086, 8088 e 80286 so
processadores, e o XT um computador. Seria correto dizer que no modo
real, o 80286 opera como um 8086 acrescido de instrues novas como
BOUND, ENTER, LEAVE, INSB, INSW, OUTSB, OUTSW, novos shifts,
rotates e a nova instruo IMUL, alm das instrues PUSHA e POPA.
Entretanto muitos programadores optavam por no utilizar essas novas
instrues, para que seus programas fossem compatveis com o IBM XT.
Alguns programas tinham verses para XT e verses otimizadas para 80286,
que usavam essas novas instrues. Apenas no final dos anos 80, quando o
AT-286 era mais comum que o XT, surgiram programas que rodavam
somente no 286, utilizando essas novas instrues.
Modo protegido

O 80286 passa a ter novos recursos para gerenciamento de tarefas e


endereamento de memria quando opera no modo protegido. Lembre que
no 8086, cada segmento tinha 64 kB, e era definido pelos registradores de
segmento (CS, DS, ES e SS). Todos os segmentos eram contidos dentro da
memria fsica de 1 MB. No 286 operando em modo protegido, os
segmentos tambm tm 64 kB, e so definidos por um registrador de
segmento (CS, DS, ES e SS) e um offset. A diferena est na formao desses
endereos. Consideremos por exemplo o endereo F000:1000 no modo real.
Conforme mostramos neste captulo, o endereo absoluto correspondente
F1000. obtido acrescentando um zero hexadecimal (ou 4 zeros binrios)
direita do segmento e somando o resultado com o offset. O resultado ter 20
bits, permitindo enderear at 1 MB.
No modo protegido, os endereos tambm so indicados por um valor de
segmento e um valor de offset. A diferena que o valor do segmento no
usado diretamente na formao do endereo. Ele usado como ndice em
uma tabela chamada segment descriptor table. A partir do valor do
segmento determinado o elemento da tabela que traz o endereo real do
segmento desejado, com 24 bits. Este valor somado com o offset,
resultando em um endereo fsico de 24 bits, permitindo assim enderear at
16 MB de memria.
As tarefas (tasks) no 286 recebem um identificador de privilgio que varia de
0 a 3. O privilgio 0 dado ao ncleo do sistema operacional. o nico
nvel que permite gerenciar parmetros das demas tarefas, tendo acesso a
todas as instrues de gerenciamento de memria e de tarefas. Os nveis de
privilgio 1 e 2 so usados pelo sistema operacional, e o nvel 3 dado s
aplicaes. Isso impede que um programa de um usurio possa interferir

8-44

Hardware Total

com o gerenciamento de memria e de tarefas. Note que esses recursos s


esto disponveis no modo protegido.
O pouco uso do modo protegido do 286

Apesar do 286 ter sido lanado em 1982 e bastante avanado para a sua
poca, quase sempre este processador era usado no modo real. Este
processador comeou a ser desenvolvido no final dos anos 70, e at o seu
lanamento, ocorreu uma verdadeira reviravolta na indstria de
microcomputadores:
a) Transio entre os micros de 8 e de 16 bits
b) Lanamento do IBM PC
c) Lanamento do MS-DOS
d) Consolidao do IBM PC e do MS-DOS no mercado de micros
O modo real bastante limitado. Lembra muito a operao dos
processadores de 8 bits. J o modo protegido tem caractersticas de
computadores mais poderosos. Recursos antes encontrados apenas em
computadores de grande porte passariam a fazer parte dos
microcomputadores. Era tido como bvia a criao de novos sistemas
operacionais mais avanados, operando em modo protegido. Tudo indicava
que esses novos sistemas operacionais tomariam o lugar do arcaico DOS de
modo real, que no passava de uma herana do sistema operacional CPM,
usado nos micros de 8 bits desde os anos 70. Seriam criados sistemas mais
poderosos, e o 80286 era um processador com recursos avanados para
atender a esses novos sistemas.
No foi bem isso o que ocorreu. O IBM PC passou a ser cada vez mais
usado, at chegar ao ponto em que microcomputador passou a ser sinnimo
de IBM PC. O nmero de PCs aumentou ainda mais depois que surgiram os
clones, ou seja, PCs similares produzidos por outros fabricantes. Ao lado do
PC, o sistema operacional MS-DOS com toda a sua limitao tornou-se mais
utilizado que todos os demais sistemas operacionais.
Quem poderia imagiar, durante o projeto do 286, que o arcaico MS-DOS
faria tanto sucesso durante tantos anos? Por isso o 286 no foi projetado sob
medida para o MS-DOS, e sim para sistemas mais avanados. Apesar de um
PC equipado com um 286 de 6 MHz ser quase 6 vezes mais veloz que um
XT, o MS-DOS no podia fazer uso dos 16 MB (memria estendida) de
memria que o 286 era capaz de enderear. O 286 s oferece 16 MB no
modo protegido, e o MS-DOS s opera no modo real.

Captulo 8 Arquitetura de processadores

8-45

Visando vencer esta dificuldade, a Lotus, a Intel e a Microsoft criaram uma


especificao de memria chamada EMS (Expanded Memory Specification),
tambm conhecida como memria expandida. Consiste em uma placa de
memria com circuitos de controle que permitiam acessar maiores
quantidades de memria no modo real, usando um mecanismo de
chaveamento de bancos de memria. A memria expandida foi muito mais
usada que a estendida, que s estava disponvel no modo protegido.
Placas de CPU 286 com suporte para mais de 1 MB de memria podiam
operar com memria estendida se fosse usado um sistema operacional de
modo protegido. Essas placas tambm possuam circuitos de controle que
transformavam sua memria acima de 1 MB em memria EMS, permitindo
o seu acesso pelos programas do MS-DOS.
Um outro problema agravava a situao do 286. Uma vez entrando em
modo protegido, no poderia retornar ao modo real, a menos que o
processador sofresse um RESET. Uma anlise precipitada poderia nos levar
a pensar que isso foi um erro de projeto da Intel. Lembre-se entretanto que o
286 foi lanado em 1982, e naquela poca o IBM PC no era o computador
mais comum no mercado, nem o MS-DOS era o sistema operacional mais
usado, e a evoluo da tecnologia apontava para o uso de novos sistemas
operacionais de modo protegido. Para que ento um processador precisaria
ir e voltar entre o modo real e o modo protegido? Afinal no existiam
sistemas mistos. Ou eram de modo real (MS-DOS e CPM-86, por exemplo)
ou de modo protegido. A prpria IBM, na poca, havia comprado parte da
Intel, e nos seus planos estava o sistema operacional OS/2 (modo protegido)
que cairia como uma luva no 286.
O processador 80386, lanado em 1985, foi projetado dentro de uma
realidade em que o PC dominava o mercado, assim como o MS-DOS. Seu
projeto levou em conta esses fatores, e mudanas foram feitas nos seus
modos de endereamento, como veremos a seguir.

Arquitetura do 80386
muito importante conhecer bem o 386, pois todos os processadores
posteriores, do 486 ao Pentium 4, utilizam mtodos semelhantes de
gerenciamento de memria e multitarefa, bem como possuem conjuntos de
instrues similares, com apenas algumas poucas diferenas.
A figura 14 mostra o diagrama interno do 386. Alm de vrios elementos
encontrados em outros processadores, destacam-se as unidades de

8-46

Hardware Total

gerenciamento de memria (segmentation unit e paging unit) e a unidade de


proteo (protection test unit), necessria ao funcionamento da multitarefa.
*** 100%
Figura
8.14
Diagrama interno do
processador 80386.

Registradores internos do 386

O 80386 um processador de 32 bits. Para que fosse mantida a


compatibilidade com o 8086 e com o 80286, cada registrador de 32 bits pode
ser tambm acessado em modos de 16 e de 8 bits. Por exemplo, o
registrador EAX tem 32 bits, mas seus 16 bits menos significativos so o
prprio registrador AX do 8086 e 80286, bem como os 8 bits menos
significativos so o registrador AL.
Figura
8.15
Registradores do
80386.

Os registradores AX, BX, CX, DX, SI, DI, BP e SP foram todos expandidos
para 32 bits. Os registradores de segmento CS, SS, DS e ES tambm esto
presentes e so de 16 bits. Foram adicionados mais dois registradores para
apontar para segmentos de dados: FS e GS. O contador de instrues (IP),

Captulo 8 Arquitetura de processadores

8-47

que antes tinha 16 bits, agora tem 32 bits, e novos flags resultaram no
aumento do registrador de flags tambm para 32 bits.
Novas instrues do 80386

Somente pelo fato dos registradores serem agora de 32 bits, o 80386 ganhou
vrias novas instrues. Todas as instrues que operavam com 8 e 16 bits,
agora operam tambm com 32 bits. Por exemplo, podemos manter nmeros
de 32 bits nos registradores EAX e EBX e usar a instruo ADD EAX,EBX,
obtendo um resultado de 32 bits. No 8086 e no 80286, uma soma de 32 bits
tinha que ser feita em duas etapas.
Alm da maioria das instrues antigas agora poderem tambm operar com
32 bits, existem vrias instrues novas. A maioria delas so aplicadas ao
gerenciamento de tarefas e ao gerenciamento de memria. So portanto
instrues para serem usadas pelo sistema operacional, e no pelos
programas comuns.
Foram ainda criados novos modos de endereamento mais poderosos.
Podemos por exemplo usar agora outros registrdores como EAX, EDX e
ECX para apontar a memria, coisa que no era permitida no 8086 nem no
80286. Podemos usar endereamentos dados por expresses como
[EDX*8+EAX] e expresses similares, permitindo o endereamento mais
rpido de matrizes, como por exemplo, uma rea de memria de vdeo onde
est sendo desenhado um grfico. Desta forma possvel manipular
estruturas de dados mais complexas utilizando um reduzido nmero de
instrues.
Existem ainda algumas novas instrues para manipulao de valores
binrios, mas no apresentam grande impacto sobre o desempenho. O ponto
forte para os programas comuns realmente o upgrade das antigas
instrues de 16 bits para 32 bits. Essas novas instrues de 32 bits podem
inclusive ser usadas (exceto as de endereamento) quando o processador
opera no modo real, no qual seu comportamento similar ao de um 8086.
Modo real

No modo real, o esquema de enereamento do processador similar ao do


8086. Alm disso no esto disponveis os recursos avanados de
endereamento e gerenciamento de memria, nem de multitarefa. Esto
entretanto disponveis as novas instrues que manipulam dados e 32 bits e
novos modos de endereamento de memria.

8-48

Hardware Total

Os endereos no modo real so formados a partir de um segmento e offset,


ambos de 16 bits. O valor existente no registrador de segmento adicionado
de 4 bits 0 e somado com o offset. O resultado o endereo efetivo de 20
bits, usado para acessar a memria fsica. Neste modo possvel acessar at
1 MB de memria, e cada segmento tem 64 kB. Exatamente como no 8086.
Figura 8.16
Endereamento no modo real.

Assim como ocorreu no 286, o modo real do 386 foi criado para oferecer
compatibilidade com os programas escritos para o 8086, como o DOS e seus
aplicativos. O modo real est presente tambm nos processadores modernos,
por isso possvel executar um boot com um disquete de DOS em um PC
equipado com o Pentium 4 e usar programas de modo real.
Modo protegido

Alm da velocidade resultante do maior clock e de operar diretamente com


dados de 32 bits, o 80386 tem a grande vantagem de operar no modo
protegido, possibilitando acessar grandes reas de memria e permitir a
multitarefa. Os valores de offset podem ter 16 ou 32 bits, permitindo formar
segmentos de 64 kB e de 4 GB. Graas ao endereamento com offsets de 32
bits, um programa poderia teoricamente ocupar toda a memria fsica de um
processador 386.
O endereamento com offsets de 32 bits possvel graas aos novos
registradores de 32 bits. Observe na figura 15 que todos os registradores
usados para enderear a memria agora tm 32 bits: AX, BX, CX, SI, DI,
BP, SP e IP.

Captulo 8 Arquitetura de processadores

8-49
Figura 8.17
Endereamento de memria no modo protegido.

A figura 17 mostra a formao de um endereo no modo protegido. Um


endereo de memria formado a partir de um segmento e de um offset. O
valor do segmento (CS, DS, ES, SS, FS ou GS) tem 16 bits, mas ao contrrio
do que ocorre no modo real, no simplesmente adicionado de zeros e
somado com o offset. Este valor usado como ndice para uma tabela na
memria (segment descriptor table), na qual obtido o endereo verdadeiro.
Este valor tem 32 bits e permite assim definir um segmento em qualquer
local da memria fsica de 4 GB. O endereo do incio do segmento
somado com o offset de 16 ou 32 bits, formando assim segmentos de 64 kB
ou de 4 GB.
Segmentao, paginao e memria virtual

Na verdade o mecanismo de endereamento ainda mais complexo. O


endereo de 32 bits usado para acessar a memria de 4 GB chamado de
endereo linear. Uma vez formado, este endereo pode ser enviado
diretamente para a memria, permitindo o seu acesso no modo de
segmentao. Os segmentos de 32 bits no utilizam o valor mximo de 4 GB,
que seria muito grande. Mtiplos processos podem utilizar vrios segmentos
diferentes, e na tabela de descritores de segmentos est indicado o tamanho
efetivamente usado para cada segmento. O valor de 4 GB o limite mximo,
mas podemos ter segmentos com vrios valores diferentes.
Um outro mecanismo de gerenciamento de memria mais simples a
paginao. Explicando de forma simples, cada endereo fsico gerado a
partir do segmento e offset (chamado de endereo linear) usado como
ndice para uma tabela de pginas. A partir desta tabela obtido o endereo
fsico na memria. Alm de fazer a traduo entre endereo linear e
endereo fsico, o mecanismo de paginao permite proteger cada pgina de
outros processos, evitanto violaes de memria. Permite ainda implementar
a memria virtual, uma rea do disco rgido na qual simulada uma grande
quantidade de RAM.

8-50

Hardware Total
Figura 8.18
Paginao.

O 80386 opera com pginas de 4 kB. Todas essas pginas podem estar
fisicamente localizadas na memria RAM. Entretanto comum utilizar este
recurso para implementar a memria virtual. No Windows a memria virtual
consiste em um arquivo mantido no disco (swap file ou arquivo de troca), o
WIN386.SWP, localizado em C:\Windows. A RAM fisicamente dividida
em pginas de 4 kB, assim como o arquivo de troca, entretanto este arquivo
tem tamanho bem maior que a memria fsica.
Digamos que um PC tenha 64 MB de RAM e esteja configurado com uma
memria virtual de 256 MB. Usando um mecanismo de gerenciamento de
memria por paginao, tanto a memria fsica quanto a memria virtual
utilizaro pginas de 4 kB:
Memria fsica: 16.386 pgingas de 4 kB: total = 64 MB
Memria virtual: 65.536 pginas de 4 kB: total = 256 MB
Os programas podem ento acessar a memria como se existissem 256 MB
disponveis. Em um dado instante, apenas as pginas que esto mapeadas na
RAM podem ser acessadas pelos programas. Quando um programa faz o
acesso a um endereo de memria cuja pgina no est mapeada, ocorre
automaticamente uma interrupo (page fault) de software chamada
exceo restartvel. O atendimento desta interrupo feito pelo ncleo
do sistema operacional, que providencia uma pgina livre na RAM e copia
para a mesma o contedo da pgina correspondente da memria virtual.
Quando no existe pgina disponvel na RAM, o sistema operacional deve
transferir para o arquivo de troca, alguma pgina da RAM que esteja h mais
tempo sem ser usada. Terminada a liberao da pgina em RAM, o sistema
operacional providencia o retorno para a instruo que gerou a exceo.
Nete retorno, a instruo que tentou acessar a memria e no conseguiu
repetida automaticamente, e desta vez poder acessar a RAM.

Captulo 8 Arquitetura de processadores

8-51

Note que a segmentao e a paginao no esto necessariamente ligadas


memria virtual. Um PC pode estar operando com a memria virtual
desativada e ainda assim ter o acesso RAM feito por segmentao ou
paginao. Os descritores de segmento e de pgina oferecem mtodos para
no apenas proteo de memria, mas tambm detectar quando uma rea
no est mapeada na RAM, permitindo o acesso memria virtual. Em
outras palavras, quando um PC tem muita memria RAM e desativamos a
memria virtual, o gerenciamento de memria do Windows continua sendo
feito atravs da paginao.
Translation Lookaside Buffer (TLB)

O acesso memria atravs de paginao requer a converso de um


endereo linear em endereo fsico. A unidade de paginao precisa
descobrir qual o endereo fsico de cada pgina de 4 kB acessada. Esses
endereos so mantidos em uma tabela de pginas na memria, e a cada
acesso, o processador precisa descobrir atravs desta tabela, qual o
endereo fsico que deve ser acessado. Isto tornaria o processador lento, pois
qualquer acesso memria precisaria de uma acesso prvio tabela de
pginas. Para resolver o problema, o 386 tem uma pequena cache interna
dedicada a armazenar as informaes sobre pginas recentemente acessadas.
Esta rea chamada de translate lookaside buffer (TLB). Este buffer capaz
de armazenar a localizao de 32 pginas, totalizando assim, 128 kB.
estimado que em 98% dos acessos, o processador encontra as informaes de
localizao no TLB.
Modo virtual 8086

Este um novo modo de operao introduzido no 386, compatvel com o


modo real e com o modo protegido simultaneamente. No na verdade um
novo modo de operao, pois faz parte do modo protegido. Apenas as
tarefas designadas a operar neste modo tm atributos especficos que alteram
a formao dos endereos e o modo como os registradores de segmento so
tradatos.
Programas escritos para o modo real (exemplo: MS-DOS e seus aplicativos)
no funcionam no modo protegido. Basta lembrar que o sistema de
endereamento completamente diferente. Durante o projeto do 80386, o
IBM PC e o MS-DOS haviam assumido fortes posies no mercado, portanto
a Intel teve a preocupao de tornar o seu novo processador compatvel com
este sistema. O 80386 no apenas permite comutar entre o modo real e o
modo virtual (tornando possvel usar a memria estendida no ambiente
DOS, bem como usar programas de modo protegido e ainda assim ter

8-52

Hardware Total

acesso s funes do DOS, que operam em modo real), mas tambm


permite que tarefas no modo protegido possam operar no modo virtual 8086.
o modo no qual executado o Prompt do MS-DOS sob o Windows. Este
modo opera sob o modo protegido, em ambiente multitarefa, porm uma
tarefa neste modo tem o uso dos registradores de segmento idntico ao do
8086. Significa que registradores CS, DS, ES e SS indicam o valor do
segmento em 16 bits, so adicionados de 4 bits 0 e somados com um offset
de 16 bits. Para um programa que opera neste modo, est sendo acessada
uma memria de 1 MB, porm o endereo linear gerado tem 32 bits. Atravs
do mecanismo de paginao, este 1 MB pode ser mapeado em quaisquer
pginas da memria fsica ou da memria virtual. Podemos assim ter vrios
programas em modo virtual 8086 operando simultaneamente. No Windows,
isto equivale a abrir vrias janelas com o Prompt do MS-DOS.
Multitarefa

Um computador pode executar vrios programas ao mesmo tempo,


compartilhando seu tempo entre todos eles. Este tipo de ambiente
chamado de multitarefa (multitask). Assim como o 286, o 80386 tem no seu
modo protegido, todos os recursos para operar em um ambiente multitarefa.
Um desses recursos a diferenciao entre os nveis de privilgio das tarefas.
As tarefas do 386 podem ter nveis 0, 1, 2 e 3. O nvel 0 o nico que tem
acesso a todos os recursos do processador, e deve ser usado pelo ncleo do
sistema operacional. Neste nvel podem ser executadas as instrues para
gerenciamento das demais tarefas e gerenciamento de memria. Tarefas com
nveis 1 e 2 no podem executar essas instrues crticas, mas tm aceso a
algumas instrues no suportadas por programas comuns. Esses dois nveis
devem ser usados por mdulos do sistema operacional e drivers. O nvel 3
o mais baixo, e pode executar praticamente todas as instrues, exceto
aquelas mais crticas, s permitidas pelos nveis superiores. Programas
comuns devem operar no nvel 3. A figura 19 mostra como so organizados
esses nveis.

Captulo 8 Arquitetura de processadores

8-53
Figura 8.19
Nveis de privilgio do 386.

Pipeline do 386

Pipeline uma tcnica amplamente utilizada nos processadores mais novos,


mas j era utilizada em pequena escala no 386. Seu funcionamento
equivalente ao de uma linha de montagem de automveis. Ao invs de
montar um automvel de cada vez, a montagem dividida em vrias etapas
menores. Em cada estgio feita uma parte da montagem, e o automvel
passado para o estgio seguinte. Todos os estgios trabalham ao mesmo
tempo, e no cmputo geral, a produo ao final do dia bem elevada.
Nos processadores o trabalho tambm dividido em vrios estgios. Nos
modelos modernos, o nmero de estgios bem elevado. No 386 existem 6
estgios:
1) Unidade de interface com o barramento (Bus Interface Unit) Faz todos
os acessos memria e ao espao de E/S.
2) Unidade de pr-busca de cdigo (Code Prefetch Unit) Recebe as
instrues da unidade de interface com o barramento e as guarda em uma
fila de 16 bytes.
3) Unidade de decodificao de instrues (Instruction Decode Unit)
Recebe as instrues da unidade de pr-busca e as converte em
microcdigo.
4) Unidade de execuo (Execution Unit) Executa as instrues em
microcdigo.
5) Unidade de segmentao (Segment Unit) Traduz o endereo lgico,
formado por segmento e offset, em endereo linear de 32 bits.

8-54

Hardware Total

6) Unidade de paginao (Paging Unit) Traduz o endereo linear em


endereo fsico, faz as checagens de proteo de memria. Esta unidade tem
uma pequena cache (TLB) com as informaes sobre as 32 pginas mais
recentemente acessadas.
Essas unidades podem ser vistas na figura 14. Observe ainda que os blocos
do 386 so interligados por um barramento interno de 32 bits.

Arquitetura do 80486
Explicando em poucas palavras, um processador 80486 similar a um 80386,
acrescido de um coprocessador matemtico 80387, mais 8 kB de cache L1
integrada. Existem entretanto outras diferenas na arquitetura interna, sendo
a principal delas, o aumento do nmero de estgios pipeline. A figura 20
mostra o diagrama interno do 486.
*** 75%
Figura
8.20
Diagrama interno do
486.

Entre as principais diferenas em relao ao 386, notamos a cache de 8 kB,


ligada unidade de pr-busca por uma caminho de 128 bits. A fila de
instrues teve o tamanho dobrado para 32 bytes. As transferncias internas
de dados so agora feitas por dois caminhos de 32 bits.

Captulo 8 Arquitetura de processadores

8-55

As unidades de decodificao e execuo foram cada uma desmembrada


em 2 estgios pipeline. So portanto ao todo 5 estgios pileline, alm do
estgio inicial de interface com o barramento e os dois estgios finais de
segmentao e paginao. Cada um desses estgios capaz de executar sua
tarefa em um nico clock, portanto o 486 pode executar na maior parte das
vezes, uma instruo a cada perodo de clock.
Figura 8.21
Pipeline do 486.

A operao dos estgios pipeline do 486 mostrada na figura 21. So usados


5 estgios:

Prefetch
Decode 1
Decode 2
Execution
Writeback

Cada estgio opera em um ciclo de clock. Quando uma instruo entra no


pipeline, demorar 5 ciclos para ser completada (lembre-se que existe um
estgio anterior, o de interface de barramento, e dois estgios posteriores, o
de segmentao e de paginao. Cada instruo leva 5 ciclos para atravessar
o pipeline da figura 21, mas assim que passa do primeiro para o segundo
estgio, uma segunda instruo chega ao primeiro estgio. Depois de 5
clocks, o ltimo estgio estar completando a cada clock, a execuo de uma
instruo. Na figura 21, os instantes t1, t2, t3 e t4 marcam a finalizao das
instrues I1, I2, I3 e I4.
O pipeline do 486 realmente traz um grande aumento de desempenho.
Apesar de terem arquiteturas muito parecidas (sendo o pipeline mais
avanado, a principal diferena), um 486 duas vezes mais rpido que um
386 de mesmo clock.

8-56

Hardware Total

O conjunto de instrues do 486 o mesmo do 386 e do 387 reunidos, alm


de algumas instrues para controle de cache e para suporte a
multiprocessamento.

Arquitetura do Pentium
Alm do aumento de clock, o uso de arquitetura pipeline foi utilizada nos
processadores 386 e 486 para aumentar o desempenho. O Pentium tambm
tem suas operaes de decodificao e execuo realizadas por 5 estgios, tal
qual o 486. A grande evoluo a introduo da arquitetura superescalar,
atravs da qual podem ser executadas duas instrues ao mesmo tempo.
Podemos ver na figura 22 o diagrama do Pentium, no qual encontramos os
mdulos U-Pipeline e V-Pipeline. Esses dois mdulos operam de forma
simultnea, e graas a eles possvel executar duas instrues ao mesmo
tempo. Outro melhoramento a adoo do barramento de dados com 64
bits, com a qual possvel reduzir os efeitos da lentido da memria RAM.
O Pentium tem ainda uma cache L1 maior, dividida em duas sees
independentes, sendo uma para cdigo e outra para dados. A unidade de
ponto flutuante foi reprojetada, e muito mais rpida que a do 486.
** 75%
Figura
8.22
Diagrama interno do
Pentium.

Captulo 8 Arquitetura de processadores

8-57

Arquitetura superescalar

Uma arquitetura superescalar aquela na qual mltiplas instrues podem


ser executadas simultaneamente. Podemos ver na figura 23 como os
pipelines U e V do Pentium executam instrues. A execuo simultnea
possvel desde que se tratem de instrues independentes, ou seja, que a
execuo da segunda operao no dependa do resultado da primeira.
Observe que no instante t1, as instrues I1 e I2 so finalizadas, e em cada
um dos instantes seguintes, duas novas instrues so finalizadas. Desta
forma o Pentium pode teoricamente executar duas instrues a cada ciclo.
Figura 8.23
Funcionamento dos estgios pipeline do
Pentium.

Nem sempre possvel executar instrues em paralelo. Os programas so


formados por instrues seqenciais ou seja, um programa uma seqncia
de instrues. O paralelismo funciona entretanto em boa parte dos casos,
pois mesmo com instrues seqencias, muitas so independentes. Veja por
exemplo o seguinte trecho de programa:

MOVER:

MOV SI, 1000


MOV DI, 2000
MOV CX,100
MOV AL,[SI]
INC SI
MOV [DI],AL
INC DI
DEC CX
JNZ MOVER

As instrues so alimentadas nas duas pipelines de forma alteranada, sendo


uma instruo para U e outra para V. A ordem de alimentao mostrada
abaixo.
U-Pipeline

V-Pipeline

8-58

Hardware Total

MOV SI, 1000


MOV CX,1000
INC SI
INC DI
JNZ MOVER

MOV DI, 2000


MOV AL,[SI]
MOV [DI],AL
DEC CX
MOV AL,[SI]

Note que os 3 primeiros estgios de cada pipeline so de pr-busca e


decodificao, ou seja, so usados para identificar exatamente o que a
instruo deve fazer. A execuo propriamente dita feita apenas no quarto
estgio, e no quinto feito o armazenamento de valores. Se neste momento
preciso utilizar um operando que ainda est sendo calculado pela outra
pipeline, a operao no pode prosseguir. Toda a fila de instrues desta
pipeline congelada at que o dado necessrio termine de ser calculado pela
outra pipeline e esteja disponvel. Nesses instantes, apenas uma pipeline
trabalha enquanto a outra espera. Portanto em certos instantes existe a
execuo paralela, mas em outros instantes o Pentium se comporta como o
486, executando uma nica instruo de cada vez, de acordo com a
dependncia entre as instrues que so alimentadas em cada pipeline.
Previso de desvio

As dependncias entre instrues podem causar uma paralisao em uma


das pipelines, mas assim que a dependncia resolvida, as instrues
prosseguem ao longo da pipeline. Pior situao quando ocorrem desvios
condicionais. No possvel nesse caso saber que caminho tomar a
seqncia de instrues antes da finalizao de sua execuo. Veja o
exemplo:

LAB00:
LAB01:

....
DEC CX
JNZ LAB01
MOV AX,1000
ADD AX,DX
MOV BX,2000
....

Ao encontrar a instruo JNZ LAB01, o processador no saber se continua


a carregar as instrues a partir de LAB00 ou de LAB01. Um processador
486 simplesmente assume que o desvio no tomado e prossegue na
seqncia, ou seja, supe que o desvio no realizado. Se o desvio
ocorresse, o contedo de todos os estgios era decartado e a pipeline era
carregada a partir do novo endereo. Isso resultava em um perodo de
latncia de 5 ciclos, e s ento o processador voltava a fornecer uma
instruo por clock.

Captulo 8 Arquitetura de processadores

8-59

O processador Pentium tenta adivinhar se um desvio vai ser executado ou


no. Esta predio feita com base no histrico das ltimas vezes que a
instruo foi executada. Quando um desvio encontrado pela primeira vez,
o processador no tem dados para predizer se ser executado ou no,
portanto parte do princpio de que no ser executado. Ao passar pela
segunda vez por este endereo, tomando como base o resultado do ltimo
desvio, poder predizer com grande chance de acerto, se este desvio ser
executado ou no. Veja o exemplo:

LAB01:

MOV SI,1000
MOV DI, 2000
MOV CX,100
LODSB
STOSB
DEC DX
JNZ LAB01
MOV AX,1000
.

Quando o processador encontra pela primeira vez a instruo JNZ LAB01,


parte do princpio de que o desvio no ser realizado, e assume que a
prxima instruo a ser executada a seguinte (MOV AX,1000). Note
entretanto que estamos usando em CX um contador 100, e este desvio ser
realmente executado para o endereo LAB01. Quando o processador
encontra pela segunda vez esta instruo, ele sabe a partir do seu endereo,
que na vez anterior o desvio foi feito. Esta informao armazenada em dois
bits de histrico no BTB (Branch Target Buffer). Passar ento a supor que
desvio ser realizado, ou seja, depois de carregar a instruo JNZ LAB01,
carregar as instrues a partir da LODSB. Portanto nas 98 vezes seguintes
em que esta instruo for executada, o desvio ser previsto de forma correta.
Na centsima vez o desvio no ser realizado, j que o contador chegou ao
final, e o desvio ser previsto de forma errada. Neste exemplo tivemos 98%
de acerto na previso de desvio. A taxa de acerto sempre alta quando so
feitos desvios para o incio de um loop de instrues, mas mais baixa
quando so encontrados desvios que no se repetem, ou que repetem pouco.
De qualquer forma melhor acertar algumas vezes e errar outras, que parar
sempre que for encontrada uma uma instruo de desvio, como ocorria no
486 e processadores mais antigos.
Cada unidade de pr-busca possui duas filas de instrues. A primeira
sempre preenchida de forma seqencial. A segunda usada apenas quando
encontrado um desvio. Aps a instruo JNZ do ltimo exemplo, a fila
seqencial seria preenchida a partir da instruo MOV AX,1000 e a fila

8-60

Hardware Total

alternativa seria preenchida a partir da instruo LODSB. O processador


passa a preencher a fila alternativa e paralisa a outra quando prediz que o
desvio ser tomado, e deixa a fila alternativa paralisada e opera com a
principal quando prediz que o desvio no ser tomado. O Pentium no
carrega portanto as instrues das duas ramificaes, e sim, escolhe a mais
provvel (tomando como base o histrico das ltimas execues da
instruo) e passa a carregar instrues a partir deste ponto.
O mecanismo de previso de desvio realmente um pouco complexo e nem
sempre acerta, mas em caso de erro na previso, no prejudica o
processador. Ele evita que o processador pare sempre que encontra uma
instruo de desvio, e qualquer acerto lucro. Note ainda que os resultados
s so efetivados depois que a previso confirmada, portanto uma previso
errada no causa resultados errados, apenas necessita de mais 5 ciclos em
mdia para que os estgios pipeline voltem a operar com mxima eficincia.
Instruo CPUID

A partir do Pentium, os processadores Intel (o mesmo ocorre com


processadores de outros fabricantes) passaram a incluir no seu conjunto de
instrues, uma que fornece infromaes que identificam o processador. a
instruo CPUID (CPU Identification). Programas de diagnstico e
programas que do informaes sobre a configurao de hardware utilizam
esta instruo para informar corretamente o modelo do processador, bem
como identificar suas caractersticas.

Microarquitetura P6
Esta arquitetura foi usada a partir de 1995, com o lanamento do Pentium
Pro, e sofreu algumas modificaes posteriores, dando origem ao Pentium II,
Celeron e Pentium III, bem como suas verses Xeon.
Uma das principais caractersticas desta nova arquitetura a introduo de
um velho conceito j usado h alguns anos em computadores mais
poderosos: a tecnologia RISC Reduced Instruction Set Computer.
CISC e RISC

Os processadores Intel, at o Pentium inclusive, so considerados mquinas


CISC (Complex Instruction Set Computer). Significa que seu conjunto de
instrues bastante complexo, ou seja, tem muitas instrues que so
usadas com pouca freqncia. Um programador de linguagem Assembly usa
com muita freqncia instrues MOV, CALL, RET, JMP, ADD e outras,
mas raramente usa instrues como XLAT e todas as opes de shifts e

Captulo 8 Arquitetura de processadores

8-61

rotates A instruo XLAT, por exemplo, poderia ser substituda pela


seqncia ADD BX,AX / MOV AL,[BX]. Teoricamente o uso de uma nica
instruo teria uma execuo mais rpida que se fossem usadas duas ou mais
instrues, mas na prtica no o que ocorre. Um processador com um
conjunto de instrues muito complexo perde muito tempo para decodificar
uma instruo. Alm disso, um maior nmero de circuitos internos seria
necessrio para a implementao de todas essas instrues. Muitos desses
circuitos so pouco utilizados a acabam apenas ocupando espao e
consumindo energia. Maior nmero de transistores resulta em maior
aquecimento, o que impe uma limitao no clock mximo que o
processador pode utilizar.
Por outro lado, a arquitetura RISC (Reduced Instruction Set Computer
computador com conjunto de instrues reduzido) utiliza instrues mais
simples, porm resulta em vrias vantagens. Instrues simples podem ser
executadas em um menor nmero de ciclos. Com menos instrues, a
decodificao de instrues mais rpida e os circuitos do decodificador
passam a ocupar menos espao. Com menos circuitos, torna-se menor o
aquecimento, e clocks mais elevados podem ser usados. Todas essas
vantagens compensam o fato de um processador RISC no ter instrues
poderosas como XLAT, por exemplo. Colocando tudo na balana, um
processador RISC consegue ser mais veloz que um CISC de mesma
tecnologia de fabricao.
Existe um caso clssico em um processador CISC usado em um computador
de grande porte produzido pela Digital (VAX 8600) nos anos 80. Ele tinha
uma instruo BOUND, usada para checar se um ndice est dentro dos
limites permitidos por um array (a instruo BOUND do 80826 faz um
trabalho similar). Se fossem usadas instrues mais simples de comparao
do prprio processador do VAX 8600, a execuo seria mais rpida que
com o uso da sua prpria instruo BOUND. Isso d uma idia de como
instrues complexas tendem a reduzir a eficincia do computador. A nica
vantagem aparente das instrues complexas a economia de memria.
Entretanto isso j deixou de ser vantagem h muitos anos, devido queda de
preos das memrias.
H muitos anos se fala em abandonar completamente o velho conjunto de
instrues CISC da famlia x86 e adotar uma nova arquitetura, com um
conjunto de instrues novo. Isto traria entretanto um grande problema, que
a incompatibilidade com os softwares j existentes, mas um dia ser feita
esta transio ( o que a Intel espera fazer com a chegada do processador
Itanium). Enquanto isso, os fabricantes de processadores adotaram um novo

8-62

Hardware Total

mtodo de construo dos seus chips. Utilizam internamente um ncleo


RISC, mas externamente comportam-se como mquinas CISC. Esses
processadores aceitam as instrues x86 e as convertem para instrues RISC
no seu interior para que sejam executadas pelo seu ncleo. Este processo
mostrou-se mais eficiente que tentar produzir novos processadores CISC. O
Pentium MMX foi o ltimo processador totalmente CISC. Todos os novos
processadores utilizam um ncleo RISC e tradutores internos de CISC para
RISC.
Execuo dinmica

Processadores de microarquitetura P6 utilizam um mecanismo de execuo


fora de ordem que a Intel chama de Dynamic Execution. A execuo fora
de ordem um recurso necessrio para o paralelismo no processamento de
instrues. A execuo dinmica utiliza por sua vez, trs tcnicas:

Previso de desvio
Anlise dinmica do fluxo de dados
Execuo especulativa

A previso de desvio consiste em manter as unidades de busca e


decodificao buscando instrues a partir de um desvio condicional, ao
invs de simplesmente parar at que o desvio seja processado. Tcnicas de
previso de desvio mais avanadas fazem com que a taxa de acerto nas
previses seja mais alta que nos processadores anteriores. Na previso de
desvio, no feito o carregamento das duas ramificaes de um desvio
condicional, e sim, escolhido um caminho mais provvel e este passa a ser
carregado para execuo.
A anlise dinmica do fluxo de dados consiste em monitorar as instrues
em andamento e determinar quais delas podem ser executadas antes de
outras sem prejudicar a intergridade dos dados. Nos processadores Pentium,
a checagem de dependncias era feita apenas entre as instrues que
estavam sendo executadas nas pipelines U e V. Nos processadores de
microarquitetura P6, um nmero maior de instrues pode ser monitorado,
sendo determinada uma ordem de execuo que tende a aproveitar melhor
as unidades de execuo.
Execuo especulativa

A execuo especulativa uma das trs tcnicas usadas na execuo


dinmica, e sem dvida uma grande inovao, por isso preferimos explicla separadamente. Processadores de arquitetura P6 buscam constantemente

Captulo 8 Arquitetura de processadores

8-63

instrues na memria, fazem sua decodificao e as colocam em um pool


de instrues (figura 24). Podemos visualizar este pool como uma espcie de
tanque com instrues a serem executadas. As unidades de execuo
trabalham constantemente executando as instrues deste pool que no
possuem dependncias em relao a outras instrues. A ordem na qual
essas instrues so executadas no necessariamente a mesma ordem na
qual elas se encontram nos programas. Uma unidade de retirada
encarregada de finalizar as instrues, o que consiste em armazenar valores
finais na memria e nos registradores. Esta unidade de retirada
encarregada de restabelecer a ordem original das instrues, conforme se
encontram nos programas.
Figura 8.24
Modelo simplificado de um processador
de microarquitetura P6.

Observe ainda na figura 24 que todo o acesso memria feito por


intermdio das caches. A unidade de busca e decodificao obtm
instrues da cache L1. Se a instruo a ser buscada no est na cache L1,
feita automaticamente a busca na cache L2. Se a instruo no est na cache
L2, automaticamente ser feita a busca na memria externa. O mesmo
ocorre na leitura e escrita de dados , sempre feitas a partir da seo de dados
da cache L1. A separao da cache L1 em sees de cdigo e de dados
serve para no interromper o fluxo de instrues sendo buscadas quando
preciso acessar dados.
O processadores Pentium nunca executavam antecipadamente instrues
posteriores a um desvio. Eles apenas chutavam qual dos ramos de um
desvio seria tomado e adiantavam a execuo do ramo escolhido. Se
ocorresse um erro nesta previso, o contedo da pipeline era simplesmente

8-64

Hardware Total

descartado. Na microarquitetura P6, as instrues so executadas fora de


ordem. Desta forma uma instruo posterior a um desvio poderia ser
executada antes do desvio ser processado. Se a previso de desvio fosse
errada, teramos uma instruo sendo processada indevidamente. Este
problema resolvido pela unidade de retirada de instrues. Ela somente
retira as instrues que foram efetivamente executadas. Aquelas que foram
executadas antecipadamente e indevidamente so descartadas. Para evitar
que uma instruo descartada altere um registrador ou endereo de memria
indevidamente, a atualizao dos registradores e da memria s feita pela
unidade de retirada de instrues. Suponha por exemplo a seguinte
seqncia:

LAB01:

MOV AX,2000
DEC BX
JZ LAB01
MOV AX,1000
INC CX

Como as instrues so executadas fora de ordem, as instrues MOV


AX,1000 e INC CX podem ser executadas antes da instruo JZ LAB01 ser
processada, caso a previso de desvio tenha chutado que o desvio da
instruo JZ LAB01 no iria ser realizado. Entretanto se o desvio for
realizado, as instrues MOV AX,1000 e INC CX no deveriam ter sido
executadas. Por isso as unidades de execuo no atualizam efetivamente os
registradores e a memria, e sim indicam que dados devero ser
armazenados caso as instrues sejam realmente executadas.
Micro-ops

O ncleo dos processadores de arquitetura P6 RISC. Sua unidade de


busca e decodificao converte as instrues CISC (x86) obtidas da memria
em instrues RISC. A Intel prefere chamar essas instrues RISC de microops.

Captulo 8 Arquitetura de processadores

8-65
Figura 8.25
Diagrama interno de
processadores P6.

Diagrama interno do processador

Na figura 25 vemos o diagrama interno de processadores de microarquitetura


P6. A unidade de busca de instrues (Instruction Fetch Unit) obtm
instrues CISC x86 da cache L1 de cdigo e as envia para o decodificador
de instrues. Este decodificador faz a converso dessas instrues para
micro-ops, ou seja, instrues RISC. Essas instrues so ento enviadas ao
instrucion pool, onde so executadas fora de ordem. Note portanto que as
instrues encontradas no instruction pool no so instrues CISC, e sim,
micro-ops (RISC). A partir do decodificador de instrues, o processador
totalmente RISC. A unidade de execuo tem 5 estgios paralelos,
permitindo a execuo de at 5 micro-ops por perodo de clock.
No diagrama da figura 25 vemos outros blocos importantes:
Branch Target Buffer um conjunto de ponteiros com endereos das
instrues resultantes de desvios. Seu uso importante na previso de
desvio.
Microcode Instruction Sequencer Operaes CISC simples so traduzidas
diretamente em uma nica micro-op. Operaes mais complexas podem ser
traduzidas em vrias micro-ops. Ao invs de usar um decodificador
complexo capaz de converter todas as instrues, aquelas mais complexas e

8-66

Hardware Total

menos usadas so convertidas atravs de uma tabela encontrada neste


mdulo. O Microcode Instruction Sequencer portanto uma ROM
contendo micro-ops equivalentes s instrues CISC x86 mais complexas.
Memory Reorder Buffer Este mdulo recebe uma seqncia de operaes
de leitura e escrita na memria e rearruma essas operaes de forma mais
eficiente. Faz por exemplo com que as leituras sejam efetivadas antes das
escritas, evitando assim que o processador tenha que esperar muito por um
dado da memria.
Registre File o conjunto de registradores da arquitetura Intel: EAX,
EBX, ECX, etc.
Adies na arquitetura P6

O Pentium Pro foi o primeiro processador a utilizar esta arquitetura. Com o


Pentium II, algumas alteraes importantes foram feitas, como a adio de
instrues MMX, maior eficincia na execuo de programas de 16 bits e
alteraes estratgicas na cache L2. Como sabemos, o Pentium Pro tinha 256
kB de cache L2 integrada, e o Pentium II, assim como as primeiras verses
do Pentium III, usavam uma cache L2 separada do ncleo, formada por
chips SRAM, com 512 kB e operando com a metade da freqncia do
ncleo.
O Pentium III recebeu novas instrues chamadas SSE. So novas instrues
MMX e para processamento de grficos em 3D. Posteriormente o Pentium
III teve a sua cache L2 integrada ao ncleo. Esta cache passou tambm a ter
256 kB e opera com a mesma freqncia do ncleo. Finalmente o Pentium
III Tualatin teve esta cache aumentada para 512 kB.

Arquitetura do Pentium 4
O Pentium 4 e o Intel Xeon so os primeiros processadores a utilizarem a
nova arquitetura Netburst da Intel. Apesar de ter muitos pontos em comum
com a arquitetura P6, a Netburst um projeto totalmente novo.

Captulo 8 Arquitetura de processadores

8-67
Figura 8.26
Diagrama interno do Pentium
4.

Um ponto notvel desta arquitetura a nova cache L1, chamada de


Execution Trace Cache. As caches L1 de processadores anteriores
armazenam instrues x86 (IA-32). As unidades de pr-busca e decodificao
lidam com instrues provenientes da cache L1 e as introduzem nas
pipelines ou no pool de instrues para que sejam executadas. Nos
processadores de arquitetura P6, as instrues provenientes dos
decodificadores so micro-ops (instrues RISC). Nas mquinas Netburst
como o Pentium 4, as unidades de pr-busca e decodificao obtm as
instrues diretamente da cache L2, e no da cache L1. Instrues j
decodificadas e convertidas em micro-ops so transferidas para a cache L1,
de onde as unidades de execuo obtm as micro-ops a serem executadas. A
vantagem de operar desta forma que nos programas sempre temos
instrues que so executadas repetidas vezes. No necessrio decodificar
novamente instrues que foram executadas h pouco tempo, pois sua forma
j convertida em micro-ops ainda estar na cache L1. Portanto o trabalho de
decodificao feito uma s vez, e aproveitado novamente quando uma
mesma instruo executada outras vezes.
Existe um certo mistrio da Intel em relao ao tamanho da cache L1.
Apenas divulgado que esta cache armazena 12k micro-ops, mas no o seu
tamanho em kB. Isto gera uma certa confuso, inclusive este autor j
divulgou erradamente como 12 kB, o tamanho da cache L1 do Pentium 4, o
que no est correto. So na verdade 12k micro-ops. Por outro lado, a Intel
no divulga oficialmente o tamanho de uma micro-op nas mquinas
Netburst. Apenas divulgado que a eficincia desta cache de 12k micro-ops
similar de uma cache comum com tamanho entre 8 kB e 16 kB. Ou seja,
em termos de eficincia da cache L1, similar de um Pentium III e outras

8-68

Hardware Total

mquinas P6. J a cache L1 de dados opera de forma similar das caches L1


de outras arquiteturas. Seu tamanho 8 kB.
Mquinas Netburst tm um pool de instrues capaz de manter 126
instrues em andamento. Nas mquinas P6 eram apenas 40 instrues. Isto
permite executar um nmero maior de instrues antecipadas, ou seja, fora
de ordem. A unidade de execuo pode executar at 6 instrues por ciclo
de clock, resultando em alto grau de paralelismo.
Mquinas Netburst so classificadas como hyperpipelined. operando com
pipeline de 20 estgios (mquinas P6 operavam com 10 estgios). Usar
estgios menores significa que cada um dos estgios pode ser mais simples,
com um menor nmero de portas lgicas. Com menos portas lgicas ligadas
em srie, menor o retardo de propagao entre essas portas, e desta forma
o ciclo de operao pode ser menor, ou seja, a freqncia de operao pode
ser maior. Mquinas Netburst podem portanto operar com maiores
freqncias de operao que as mquinas P6 de mesma tecnologia. Usando a
mesma tecnologia de produo do Pentium III (0,18), o Pentium 4 capaz
de atingir clocks duas vezes maiores.

De 32 para 64 bits
Os processadores usados em praticamente todos os PCs modernos utilizam a
arquitetura x86, tambm chamada de IA-32. O termo x86 devido origem
dos processadores usados no PC, comeando com o a famlia 8086/8088.
Processadores 8086, 8088, 80186, 80188 e 80286 eram todos de 16 bits.
Significa que a maioria das suas instrues operavam com valores inteiros de
at 16 bits, e que praticamente todos os seus registradores internos tinham 16
bits.
O termo IA-32 mais novo, e significa Arquitetura Intel de 32 bits.
derivada do processador 80386. Todos os processadores usados nos PCs
modernos so derivados desta arquitetura. Em outras palavras, podemos
considerar o Pentium 4 e o Athlon como verses super velozes do 386,
acrescidos de alguns recursos, porm so todos baseados em conjuntos de
instrues compatveis com o do 386. Os termos x86 e IA-32 so usados
como sinnimos, sendo que a AMD prefere usar o termo x86, enquanto a
Intel prefere usar IA-32.
Tanto a Intel como a AMD esto entrando na era dos 64 bits, cada uma com
sua prpria arquitetura:

Captulo 8 Arquitetura de processadores

8-69

Intel: IA-64
AMD: AMD x86-64
Essas duas arquiteturas tm caractersticas distintas. Ambas so de 64 bits, ou
seja, utilizam registradores, valores e endereos de 64 bits, apesar de
poderem tambm manipular valores de 32, 16 e 8 bits.
Intel IA-64

A arquitetura IA-64 incompatvel com a IA-32. Isto significa que os


programas que usamos nos PCs atuais no funcionaro nos PCs baseados na
arquitetura IA-64. Para facilitar a transio entre as arquiteturas IA-32 e IA64, o processador Intel Itanium (o primeiro a ser produzido com a IA-64)
utiliza um tradutor interno de instrues IA-32 para IA-64. Desta forma
poder utilizar os programas atuais, porm com desempenho reduzido.
A idia no comprar PCs com o Itanium para executar os programas
atuais, e sim, utilizar os novos programas IA-64. Porm enquanto no
estiverem disponveis todos os programas na verso de 64 bits, podero ser
usadas verses antigas (ou seja, atuais) de 32 bits. Inicialmente a arquitetura
IA-64 voltada para servidores e workstations de alto desempenho para uso
em CAD, processamento cientfico e outras aplicaes que exigem grande
quantidade de clculos.
Para os PCs normais, a Intel continuar fornecendo processadores IA-32,
como o Pentium 4 e seus sucessores. Desta forma foi aberto um leque de
opes: novos processadores de 32 bits e novos processadores de 64 bits,
porm compatveis com os de 32 bits.
AMD x86-64

A AMD tambm lanar processadores de 64 bits, entretanto foi adotada


uma arquitetura diferente, chamada AMD x86-64. Entendendo de forma
bem simples, esta arquitetura engloba a atual IA-32 (ou x86, de 32 bits) e
adiciona recursos de 64 bits. Desta forma os programas podero operar com
valores de 64, 32, 16 e 8 bits. Os atuais programas de 32 bits funcionaro
perfeitamente nesta nova plataforma. Internamente os processadores
possuiro os mesmos registradores internos encontrados nas mquinas x86,
porm ampliados para 64 bits. uma evoluo parecida com a transio de
16 para 32 bits, a partir do 80386. No 386, todos os registradores e instrues
de 16 bits foram mantidos, e ainda ampliados para 32 bits.

8-70

Hardware Total

Os programas atuais para 32 bits continuaro funcionando normalmente,


com seu pleno desempenho, ao contrrio do que ocorre na arquitetura IA64, que incompatvel com a IA-32. Temos aqui um pequeno problema: os
futuros programas de 64 bits para a plataforma IA-64 sero incompatveis
com os programas de 64 bits para a arquitetura x86-64. Os fabricantes de
software tero que desenvolver seus programas nas duas verses, e quando
no o fizerem, o usurio ter que usar apenas os programas especficos para
sua arquitetura, Intel ou AMD.
Os primeiros processadores AMD de 64 bits possuem os nomes provisrios
de ClawHammer e SledgeHammer. Ambos sero processadores de 8a
gerao, 64 bits e tecnologia de 0,13, com lanamento previsto para 2002.
O ClawHammer ir operar em sistemas para at 2 processadores, e o
SledgeHammer ir operar com sistemas para 4 e 8 processadores.
32 bits para vrios anos

A chegada dos processadores de 64 bits no vai sepultar de uma ora para


outra a tecnologia de 32 bits. Podemos comparar com o que ocorreu na
transio de 16 para 32 bits. O 80386 foi lanado em 1985, mas o 286, de 16
bits, continuou sendo o processador mais usado at o incio dos anos 90,
sendo finalizada a sua produo em 1993. A partir da os PCs tm usado
apenas arquiteturas de 32 bits, desde o 386 at o Pentium 4 e o Athlon.
A transio de 32 para 64 bits no ser diferente. Novos processadores de 32
bits continuaro sendo lanados e bastante utilizados em todos os PCs. Os
modelos de 64 bits comearo a ser usados nos PCs de alto desempenho,
como servidores e wortkstations, para depois de alguns anos entrar no
mercado de PCs comuns. Tanto assim que o Pentium 4, lanado em 2000,
inteiramente de 32 bits, e ganhar novas verses nos prximos anos. A
arquitetura de 64 bits da AMD, por sua vez, no abandona a atual de 32 bits,
portanto os programas atuais podero continuar sendo usados por muitos
anos. Assim como hoje um Pentium 4 capaz de executar programas de 16
bits, os processadores de 64 bits da AMD continuaro operando tambm
com 32 bits.

Processador Intel Itanium


A figura 27 mostra um processador Intel Itanium, o primeiro baseado na
arquitetura IA-64. No incio do seu desenvolvimento era conhecido pelo seu
nome-cdigo, Merced. produzido na forma de um cartucho chamado
PAC418, o mesmo nome do soquete usado nas placas de CPU para este
processador. No interior do cartucho encontramos o processador

Captulo 8 Arquitetura de processadores

8-71

propriamente dito e os chips SRAM que formam a cache L3. As primeiras


verses do Itanium tm 2 MB ou 4 MB de cache L3. As caches L1 e L2 so
integradas ao ncleo do processador, e as placas de CPU ainda podero usar
uma cache L4 opcional. O Itanium possui 15 unidades de execuo e 256
registradores internos de 64 bits, sendo 128 para nmeros inteiros e 128 para
nmeros de ponto flutuante.
Figura 8.27
Processador Intel Itanium.

Alm da cache L3, o Itanium possui uma cache L1 com 32 kB (16 kB para
cdigo e 16 kB para dados) e cache L2 com 96 kB. Parece um tamanho
pequeno para uma cache L2, mas note que se compararmos com outros
processadores, a cache L3 de 2 MB ou 4 MB do Itanium que faz o trabalho
que em outros processadores feito pela cache L2, com 256 kB ou 512 kB.
Ainda baseado na tecnologia de 0,18, resultando na alta dissipao de calor
pelos seus 25 milhes de transistores do seu ncleo (sem contar os quase 300
milhes da cache L3), o Itanium ter sucessores baseados na nova tecnologia
de 0,13.
A figura 28 mostra em detalhes a vista superior do cartucho do Itanium.
Possui na sua parte lateral um conector exclusivo para alimentao. Existem
furos para a fixao do cooler e para fixar o cartucho na placa de CPU.

8-72

Hardware Total
Figura 8.28
Cartucho PAC418, vista superior.

A figura 29 mostra a parte inferior do cartucho. Clipes laterais fazem a


reteno do processador, ajudando a fixao no soquete. Como j
mostramos, o conector de alimentao fica na parte lateral do cartucho. Na
sua parte inferior ficam os contatos do processador propriamente dito.
Figura 8.29
Cartucho PAC418, vista inferior.

Clock interno e externo

As primeiras verses do Itanium operam com 733 e 800 MHz de clock


interno. Parecem valores baixos em comparao com o Pentium 4, que j
ultrapasssou a barreira dos 2 GHz. Note entretanto que tudo no interior do
Itanium ocorre com 64 bits, portanto tem condies de apresentar um
rendimento no mnimo duas vezes maior em comparao com o Pentium 4.
Alm disso o Itanium oferece um grau de paralelismo muito superior ao do
Pentium 4. No podemos comparar processadores de arquiteturas diferentes
levando em conta apenas o clock.

Captulo 8 Arquitetura de processadores

8-73

O clock externo das primeiras verses do Itanium de 133 MHz com DDR,
produzindo resultados equivalentes ao de um clock de 266 MHz. Seu
barramento de dados tem 64 bits, portanto a taxa de transferncia mxima
terica de 2133 MB/s.
Modelo
Itanium/733
Itanium/800

Clock externo
133 MHz
133 MHz

Clock interno
733 MHz
800 MHz

Multiplicador
5,5x
6x

OBS: Esses so os modelos previstos ao final de 2001, antes do lanamento do Itanium. A Intel
atrasou o seu lanamento e trabalhava na nova verso do Itanium, o McKinley, com clocks
mais elevados.

Voltagens e consumo eltrico

Assim como ocorre com outros processadores modernos, o Itanium informa


as voltagens de que necessita. So informadas voltagens diferentes para o
processador e para a cache L3, atravs de pinos identificadores. A voltagem
do ncleo, nas primeiras verses do Itanium, obedecia especificao da
figura 30. So suportados valores entre 1,250 e 1,600 volt, em intervalos de
0,025 volt.
Figura 8.30
Identificao da voltagem do ncleo do
Itanium.

J a voltagem usada pelos chips da cache L3 do Itanium seguem uma


especificao que pode variar entre 1,650 a 2,100 volts, em intervalos de
0,050 volt, como vemos na figura 31.

8-74

Hardware Total
Figura 8.31
Identificao da voltagem para os chips
da cache L3 do Itanium.

O Itanium um processador bastante quente. Os modelos de 733 e 800


MHz tm consumo dependente da quantidade de cache L3. Com 2 MB,
consomem cerca de 116 watts, e com 4 MB chegam a consumir 130 watts.
Todo este calor dificulta a produo de modelos com clocks mais elevados,
mas a situao ir melhorar depois da adoo da tecnologia de 0,13.
Barramentos de dados e endereos

O barramento de dados do Itanium opera com 133 MHz e DDR,


produzindo o mesmo resultado que o de um clock de 266 MHz. Opera com
64 bits, portanto apresenta uma taxa de transferncia mxima terica de
2133 MB/s. At 4 processadores podem ser ligados em conjunto na mesma
placa.
Seu barramento de endereos tem 44 bits, permitindo acessar diretamente
uma memria fsica de at 16 Terabytes (17.592.186.044.416 bytes). Ao
acessar memria virtual, opera com endereos de 54 bits, podendo
enderear at 16 Petabytes (18.014.398.509.481.984 bytes).

Futuros processadores Intel de 64 bits


Ainda so bastante escassas as informaes sobre os processadores IA-64
posteriores ao Itanium. A prpria Intel no divulga publicamente tais
informaes, exceto em conferncias. Esto previstos novos processadores
que por enquanto tm nomes cdigos de McKinley, Madison e Deerfield.
O McKinley (possivelmente ser chamado de Itanium II) dever usar a
tecnologia de 0,13 e sua cache L3 ser integrada ao ncleo. Ir operar com
clocks superiores a 1000 MHz. O Madison ter uma cache L3 maior
(possivelmente 8 MB) e um barramento externo mais veloz. O Deerfield
dever ser uma verso de baixo custo do Madison, com cache L3 de apenas
1 MB, voltado para o mercado de PCs de baixo custo. Ser uma espcie de
Celeron de Itanium.

Captulo 8 Arquitetura de processadores

/////////// FIM ///////////

8-75

Você também pode gostar