Anda di halaman 1dari 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
LHLD 1000h SHLD 2000h ; Faz L=[1000h] e H=[1001h] ; Guarda L em [2000h] e H em [2001h]

Hardware Total

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 LXI H, 300h MVI M,40 LXI D, 1000h MOV A,M STAX D SHLD 2000h XCHG ; Carrega A com o valor 100 decimal ; Copia o valor de A para o registrador C ; Carrega HL com o valor 300h. H ficar com 03 e L ficar com 00 ; Armazena no endereo 300h (apontado por HL), o valor 40 ; Carrega DE com o valor 1000h ; Move para A o valor armazanedo no endreo 300h ; Guarda o valor de A na posio 1000h da memria ; Guarda o valor de HL nas posies 2000 e 2001 ; 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
INX H INX D DCX B INX SP ; HL = HL+1 ; DE = DE+1 ; BC = BC-1 ; SP = SP+1

Hardware Total

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.
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

TRAN:

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 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

7E 12 23 13 0D C2 20 10 C9

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 JNZ JC JNC JPE JPO JP JM Ao Pula se Zero est ligado Pula se Zero est desligado 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.
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 IN 81h ANI 01 JZ INCHAR IN 80h RET PUSH B MOV B,A IN 81h ANI 02 JZ OUTC1 MOV A,B OUT 80h POP B RET ; 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

LECH:

FIM: INCHAR:

OUTCHAR: OUTC1:

8-22 Cdigos das instrues do 8080

Hardware Total

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
Op Code Mnemonic 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 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 Op Code 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 Mnemonic 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 Op Code 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 Mnemonic 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

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

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 A9 AA AB XRA C XRA D XRA E D4 D5 D6 CNC ADDR FF PUSH D SUI D8

8-23
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] 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

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

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 Figura 8.9

8-27
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


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

8-29

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 Instrues aritmticas

Hardware Total

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 Shifts e Rotates

8-33

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:
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

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 Figura 8.17

8-49
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 Figura 8.19


Nveis de privilgio do 386.

8-53

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 Arquitetura superescalar

8-57

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:
MOV SI, 1000 MOV DI, 2000 MOV CX,100 MOV AL,[SI] INC SI MOV [DI],AL INC DI DEC CX JNZ MOVER

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:
.... DEC CX JNZ LAB01 MOV AX,1000 ADD AX,DX MOV BX,2000 ....

LAB00: LAB01:

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:
MOV SI,1000 MOV DI, 2000 MOV CX,100 LODSB STOSB DEC DX JNZ LAB01 MOV AX,1000 .

LAB01:

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:
MOV AX,2000 DEC BX JZ LAB01 MOV AX,1000 INC CX

LAB01:

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


Diagrama interno de processadores P6.

8-65 Figura 8.25

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

8-75

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

Anda mungkin juga menyukai