cap08 - arquitetura de process adores

75
Capítulo 8 Arquitetura de processadores Mostraremos neste capítulo alguns conceitos importantes sobre o funcionamento interno dos processadores. Tomaremos como exemplo os processadores Intel, e com eles você entenderá conceitos como execução especulativa, pipeline, previsão de desvio, paralelismo, micro-operações, linguagem assembly, memória virtual, paginação e outros termos complexos. O assunto é difícil, 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 vários circuitos chamados de registradores. Os registradores funcionam como posições de memória, porém o seu acesso é extremamente rápido, muito mais veloz que o da cache L1. O número de bits dos registradores depende do processador. Processadores de 8 bits usam registradores de 8 bits Processadores de 16 bits usam registradores de 16 bits Processadores de 32 bits usam registradores de 32 bits Processadores 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 têm uma linguagem baseada

Upload: api-3711983

Post on 07-Jun-2015

352 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Cap08 - Arquitetura de Process Adores

Capítulo 8 Arquitetura deprocessadores Mostraremos neste capítulo alguns conceitos importantes sobre ofuncionamento interno dos processadores. Tomaremos como exemplo osprocessadores Intel, e com eles você entenderá conceitos como execuçãoespeculativa, pipeline, previsão de desvio, paralelismo, micro-operações,linguagem assembly, memória virtual, paginação e outros termos complexos.O assunto é difícil, mas vale a pena, pois o leitor passará a ter umconhecimento mais profundo sobre o que se passa dentro de umprocessador.

Registradores internos do processadorPara entender como um processador executa programas, precisamosconhecer a sua arquitetura interna, do ponto de vista de software. Dentro deum processador existem vários circuitos chamados de registradores. Osregistradores funcionam como posições de memória, porém o seu acesso éextremamente rápido, muito mais veloz que o da cache L1. O número debits dos registradores depende do processador.

Processadores de 8 bits usam registradores de 8 bits Processadores de 16 bits usam registradores de 16 bits Processadores de 32 bits usam registradores de 32 bits Processadores de 64 bits usam registradores de 64 bits

A figura 1 mostra os registradores internos dos processadores 8086, 8088 e80286, todos de 16 bits. Todos os processadores têm uma linguagem baseada

Page 2: Cap08 - Arquitetura de Process Adores

8-2 Hardware Total

em códigos numéricos na memória. Cada código significa uma instrução. Porexemplo, podemos ter uma instrução para somar o valor de AX com o valorde BX e guardar o resultado em AX. As instruções do processador queencontramos na memória são o que chamamos de linguagem de máquina.Nenhum programador consegue criar programas complexos usando alinguagem de máquina, pois ela é formada por códigos numéricos. Éverdade que alguns programadores conseguem fazer isso, mas não paraprogramas muito longos, pois tornam-se difíceis de entender e de gerenciar.Ao invés disso, são utilizados códigos representados por siglas. As siglas sãoos nomes das instruções, e os operandos dessas instruções são osregistradores, valores existentes na memória e valores constantes.

Figura 8.1

Registradores internos doprocessador 8086.

Por exemplo, a instrução que acabamos de citar, que soma o valor dosregistradores AX e BX e guarda o resultado em AX, é representada por:

ADD AX,BXEsta instrução é representada na memória pelo seguinte código de máquina:

01 D8Portanto a instrução ADD AX,BX é representada na memória por doisbytes, com valores 01 e D8 (em hexadecimal). Os bytes na memória queformam os programas são o que chamamos de linguagem de máquina. Essecódigos são lidos e executados pelo processador. Já as representações porsiglas, como “ADD AX,BX”, formam o que chamamos de linguagemassembly. Quando programamos em linguagem assembly, estamos utilizando

Page 3: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-3

as instruções nativas do processador. A linguagem assembly é usada paraescrever programas que têm contato direto com o hardware, como o BIOS edrivers. O assembly também é chamado linguagem de baixo nível, poisinterage intimamente com o hardware. Programas que não necessitam destecontato direto com o hardware não precisam ser escritos em assembly, e sãoem geral escritos em linguagens como C, Pascal, Delphi, Basic e diversasoutras. Essas são chamadas linguagens de alto nível. Nas linguagens de altonível, não nos preocupamos com os registradores do processador, nem coma sua arquitetura interna. Os programas pensam apenas em dados, matrizes,arquivos, telas, etc.

Apresentamos abaixo um pequeno trecho de um programa em linguagemassembly. Em cada linha deste programa temos na parte esquerda, osendereços, formados por duas partes (segmento e offset). A seguir temos asinstruções em códigos de máquina, e finalmente as instruções em assembly.

Endereço Código Assembly--------- ------------- ------------------------------1B8D:0100 01D8 ADD AX,BX1B8D:0102 C3 RET1B8D:0103 16 PUSH SS1B8D:0104 B03A MOV AL,3A1B8D:0106 380685D5 CMP [D585],AL1B8D:010A 750E JNZ 011A1B8D:010C 804E0402 OR BYTE PTR [BP+04],021B8D:0110 BF86D5 MOV DI,D5861B8D:0113 C6460000 MOV BYTE PTR [BP+00],001B8D:0117 E85F0B CALL 0C791B8D:011A 8B7E34 MOV DI,[BP+34]1B8D:011D 007C1B ADD [SI+1B],BH

Quando estamos programando em linguagem assembly, escrevemos apenasos nomes das instruções. Depois de escrever o programa, usando um editorde textos comum, usamos um programa chamado compilador de linguagemassembly, ou simplesmente, Assembler. O que este programa faz é ler oarquivo com as instruções (arquivo fonte) e gerar um arquivo contendoapenas os códigos das instruções, em linguagem de máquina (arquivoobjeto). O arquivo objeto passa ainda por um processo chamado link edição,e finalmente se transforma em um programa, que pode ser executado peloprocessador. O Assembler também gera um arquivo de impressão, contendoos endereços, códigos e instruções em assembly, como no trecho de listagemque mostramos acima. O programador pode utilizar esta listagem paradepurar o programa, ou seja, testar o seu funcionamento.

Page 4: Cap08 - Arquitetura de Process Adores

8-4 Hardware Total

Os códigos hexadecimais que representam as instruções do processador sãochamados de opcodes. As siglas que representam essas instruções sãochamadas de mnemônicos.

Daremos neste capítulo, noções básicas da linguagem assembly dosprocessadores modernos. Não ensinaremos a linguagem a fundo, mas osuficiente para você entender como os processadores trabalham. Como aprogramação nos processadores modernos é relativamente complexa,começaremos com o 8080, de 8 bits. A arquitetura do 8080 deu origem à do8086, que por sua vez deu origem ao 386 e aos processadores modernos.Entendendo o 8080, que é bem mais simples, será mais fácil entender osprocessadores modernos.

Linguagem Assembly 8080Aprender assembly do 8080 não é uma inutilidade, por duas razões.Primeiro porque você entenderá com muito mais facilidade o assembly dosprocessadores modernos, que afinal foram inspirados no 8080. Segundo quenem só de PCs vive um especialista em hardware. Você poderá trabalharcom placas controladoras que são baseadas nos processadores 8051 e Z80.Ambos são de 8 bits e também derivados do 8080, e são bastante utilizadosem projetos modernos.

A figura 2 mostra os registradores internos do 8080. São registradores de 8bits, com exceção do PC (Program Counter) e do SP (Stack Pointer), quetêm 16 bits.

Figura 8.2

Registradores internos do 8080.

O registrador mais importante é o acumulador. Ele é o valor de saída daunidade lógica e aritmética (ALU), na qual são realizadas todas as operações.Processadores atuais permitem fazer operações com todos os registradores,mas no 8080, o acumulador deve obrigatoriamente ter um dos operandos, esempre é onde ficam os resultados.

Os registradores B, C, D, E, H e L são de uso geral. Servem como operandosnas operações lógicas e aritméticas envolvendo o acumulador. O PC é umregistrador de 16 bits, e seus valores são usados para formar o barramento de

Page 5: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-5

endereços do processador durante as buscas de instruções. O PC temsempre o endereço da próxima instrução a ser executada.

O SP (Stack Pointer) é muito importante. Ele serve para endereçar uma áreade memória chamada stack (pilha). A pilha serve para que os programaspossam usar o que chamamos de subrotinas, que são trechos de programaque podem ser usados em vários pontos diferentes. Por exemplo, se em umprograma é preciso enviar caracteres para o vídeo, não é preciso usar emvários pontos deste programa, as diversas instruções que fazem este trabalho.Basta fazer uma subrotina com essas funções e “chamá-la” onde fornecessária. A subrotina deve terminar com uma instrução RET, que faz oprograma retornar ao ponto no qual a subrotina foi chamada. Para chamaruma subrotina, basta usar a instrução CALL. Quando esta instrução éexecutada, é automaticamente armazenado na pilha, o endereço da instruçãoimediatamente posterior à instrução CALL (endereço de retorno). Subrotinaspodem chamar outras subrotinas, permitindo assim criar programas maiscomplexos. O Stack Pointer sempre aponta para o topo da pilha, e éautomaticamente corrigido à medida em que são usadas instruções CALL eRET. A instrução RET consiste em obter o endereço de retorno existente notopo da pilha e copiá-lo para o PC (Program Counter). Isso fará com que oprograma continue a partir da instrução posterior à instrução CALL.

Os FLAGS são um conjunto de 8 bits que representam resultados deoperações aritméticas e lógicas. São os seguintes esses bits:

Símbolo Nome DescriçãoZ Zero Indica se o resultado da operação foi zeroCY Carry Indica se uma operação aritmética teve “vai um” ou “pede emprestado”P Parity Indica a paridade do resultado da operação.S Signal Indica o sinal de uma operação, se foi positivo ou negativoAC Aux. Carry Carry auxiliar, em algumas instruções especiais.

Apesar de ser um processador de 8 bits, o 8080 é capaz de realizar algumasoperações de 16 bits. Nessas operações, os registradores B e C são tratadoscomo um valor de 16 bits. O mesmo ocorre com o par D/E e H/L.

Além de manipular os registadores, o 8080 também permite obter valores namemória. Esses valores podem ser de 8 ou 16 bits, e nas instruções quefazem esses acessos, basta indicar o endereço de 16 bits da posição dememória que desejamos acessar. Além disso é possivel usar os registradoresHL, BC e DE como apontadores para posições de memória. Nas instruçõesdo assembly do 8080, o pseudo registrador M é na verdade a posição dememória (8 bits) cujo endereço está em HL.

Page 6: Cap08 - Arquitetura de Process Adores

8-6 Hardware Total

Programar em assembly do 8080 consiste em utilizar suas instruções,manipulando seus registradores para executar as funções que desejamos.

Instruções de movimentação de dados

MOV: Move dados entre dois registradores diferentes. Assim como namaioria das instruções que envolvem registradores, podemos usar M comosendo a posição de memória apontada por HL. Exemplos:

MOV A,C ; A=CMOV C,E ; C=EMOV D,M ; D=M, ou seja, a posição de memória indicada

; por HLMOV M,A ; M=A

Note que quando escrevemos programas em assembly, podemos usarcomentários em cada linha, bastando usar um ponto-e-vírgula após ainstrução. Tudo o que estiver depois do ponto-e-vírgula será ignorado peloassembler. Aqui aproveitamos este convenção para colocar tambémcomentários explicativos nas instruções de nossos exemplos.

MVI: Carrega um valor constante de 8 bits em um registrador de 8 bits ouna posição de memória apontada por HL. Exemplos:

MVI C,200 ; Carrega o registrador C com 200 (decimal)MVI A,15h ; Carrega o acumulador com 15 hexadecimalMVI M,150 ; Armazena o valor 150 em [HL]MVI L,32 ; Carrega o registrador L com 32 em decimal

Aproveitamos para além de exemplificar essas instruções, apresentar maisalgumas convenções usadas na linguagem assembly. Os números podem serrepresentados nos formatos binário, octal, hexadecimal ou decimal. Quandonão usamos sufixos após os números, considera-se que são númerosdecimais. Para números hexadecimais, usamos o sufixo H. Quando umnúmero hexadecimal começa com A, B, C, E, E ou F, temos que usar um“0” no início, para que o assembler não pense que se trata de uma variável, enão um número. Números binários devem terminar com “b”, e númerosoctais devem terminar com “q”. Exemplos:

190 10010111b325q8BC3h

Page 7: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-7

Os quatro números acima estão expressos respectivamente em decimal,binário, octal e hexadecimal.

Outra convenção que vamos introduzir aqui é usar o símbolo [HL] paraindicar a posição de memória cujo endereço é dado por HL. Na linguagemassembly do 8080, este é o papel do símbolo M. Não usamos [HL], porémesta convenção foi adotada no assembly do 8086 e outros processadores maisnovos. Da mesma forma vamos usar os símbolos [BC] e [DE] para indicar asposições de memória apontadas por BC e por DE.

LXI: Carrega um valor constante de 16 bits em um dos pares BC, DE, HL eno Stack Pointer. Exemplos:

LXI H,35AFh ; Carega HL com o valor 35AF hexadecimalLXI D,25100 ; Carrega DE com o valor 25100 decimalLXI B,0 ; Carrega BC com 0LXI SP,200 ; Carrega o Stack Pointer com 200 decimal

Note que os números de 8 bits podem assumir valores inteiros positivos de 0a 255 decimal (ou de 0 a FF em hexadecimal). Os números inteiros positivosde 16 bits podem assumir valores entre 0 e 65.535 decimal (ou 0 a FFFFhex).

Obseve a instrução LXI H, 35AFh. Este valor 35AF é formado por 16 bits,sendo que os 8 bits mais significativos têm o valor 35 hex, e os 8 bits menossignificativos têm o valor AF hex. No par HL, o registrador H é o maissignificativo, e o registrador L é o menos significativo. Sendo assim oregistrador H ficará com 35 hex e o registrador L ficará com AF hex.

LDA e STA: A instrução LDA carrega o acumulador (registrador A) com ovalor que está no endereço de memória especificado. A instrução STA faz oinverso, ou seja, guarda o valor de A na posição de memória especificada.Exemplos:

LDA 1000h ; Carrega A com o valor existente em [1000h]STA 2000h ; Guarda o valor de A em [2000h]

Estamos utilizando a partir de agora a notação [nnnn] para indicar a posiçãode memória cujo endereço é nnnn. Esta notação não é usada no assemblypara 8080, mas é usada no assembly do 8086 e superiores.

LHLD e SHLD: A instrução LHLD carrega nos registradores H e L, o valorde 16 bits existente nas duas células de memória cujo endereço éespecificado. A instrução SHLD faz o inverso. Exemplos:

Page 8: Cap08 - Arquitetura de Process Adores

8-8 Hardware Total

LHLD 1000h ; Faz L=[1000h] e H=[1001h]SHLD 2000h ; Guarda L em [2000h] e H em [2001h]

Aqui vai mais um conceito importante. A memória do 8080 é uma sucessãode bytes, mas podemos também acessar words, ou seja, grupos de 16 bits. Aoperação envolve dos bytes consecutivos, e nas instruções indicamos apenaso endereço do primeiro byte. Os 8 bits menos significativos estãorelacionados com a posição de memória indicada, e os 8 bits seguintes estãorelacionados com a próxima posição. A figura 3 ilustra o que ocorre aousarmos a instrução SHLD 2000h, levando em conta que H está com o valor35h e L com o valor 8Ch.

Figura 8.3

Armazenando HL em [2000h].

Esta convenção é utilizada por todos os processadores Intel. Sempre que éfeita uma leitura ou escrita na memória, as partes menos significativas dizemrespeito aos endereço menores, e as partes mais significativas correspondemaos endereços maiores.

LDAX e STAX: Essas instruções fazem respectivamente operações de load(carrega) e store (guarda) do acumulador, usando a posição de memória cujoendereço está no par BC ou DE. Exemplos:

LDAX D ; A = [DE]STAX B ; [BC] = ALDAX B ; A = [BC]STAX D ; [DE] = A

Note que estamos usando as notações [BC] e [DE] para indicar as posiçõesde memória cujos endereços são dados por BC e DE. Observe que asinstruções LDAX H e STAX H não existem, mas em seu lugar temos “MOVA,M” e “MOV M,A” que fazem a mesma coisa.

Page 9: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-9

XCHG: Troca o valor de HL com o valor de DE. Esta instrução só é usadana forma:

XCHG ; DE HL

Trecho de programa com movimentação de dados

Mostraremos agora uma seqüência de instruções de movimentação de dadosapresentadas aqui. Usaremos depois de cada instrução, um ponto-e-vírgula,seguido de comentários. Esta é uma prática comum nos programas emassembly e em outras linguagens. O comentário não produz instruções parao processador, apenas serve para o programador explicar melhor o seuprograma.

INIC: MVI A,100 ; Carrega A com o valor 100 decimalMOV C,A ; Copia o valor de A para o registrador C

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

MVI M,40 ; Armazena no endereço 300h (apontado por HL), o valor 40

LXI D, 1000h ; Carrega DE com o valor 1000h

MOV A,M ; Move para A o valor armazanedo no endreço 300h

STAX D ; Guarda o valor de A na posição 1000h da memória

SHLD 2000h ; Guarda o valor de HL nas posições 2000 e 2001

XCHG ; Troca os valores de DE e HL

Na listagem acima, “INIC:” é o que chamamos de LABEL. Ele seráentendido pelo assembler como um endereço que deverá ser utilizadoposteriormente em alguma instrução.

Instruções aritméticas

ADD: Soma com A, o valor do registrador especificado, ou da posição dememória apontada por HL (M). O resultado da operação é armazenado emA. Exemplos:

ADD B ; A = A+BADD C ; A = A=CADD L ; A = A+LADD M ; A = A+[HL]

Assim como ocorre com todas as instruções aritméticas e lógicas, os flags (Z,CY, P, S e AC) são atualizados de acordo com o resultado da operação. Porexemplo, se somarmos C8h com 72h, o resultado será 13Ah. Este valor nãocabe em 8 bits, portanto o resultado será 3Ah e o bit Carry será ligado paraindicar que ocorreu um “vai 1”.

Page 10: Cap08 - Arquitetura de Process Adores

8-10 Hardware Total

ADI. Soma com A, o valor constante especificado. O resultado ficaarmazenado em A. Exemplos:

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

ADC: Semelhante à instrução ADD, exceto que o bit Carry também éadicionado. Esta operação serve para fazer somas com “vai 1”. Desta forampodemos dividir números grande em valores de 8 bits, e somar 8 bits decada vez. Sempre que fazemos uma soma, o Carry ficará com o “vai 1” daoperação, e assim poderá ser usado para somar a parcela seguinte.Exemplos:

ADC L ; A = A+L+carryADC D ; A = A+D+carryADC M ; A = A+[HL]+carry

ACI: Semelhante à instrução ADI, exceto pelo Carry também entrar nasoma. Exemplos:

ACI 90 ; A = A+90+carryACI 84 ; A = A+84+carry

SUB: Faz uma subtração de A com o registrador (A = A-registrador) ou comM. Exemplos:

SUB D ; A = A-DSUB C ; A = A-CSUB M ; A = A-[HL]

Nesta operação, o carry é ligado para indicar o resultado negativo, o queserve para fazer cálculos com vários dígitos, usando o método de “pediremprestado”.

SUI: Subtrai do acumulador, o número especificado. Por exemplo:

SUI 20 ; A = A-20SUI 82 ; A = A-82SUI 0DFh ; A = A-DF (hex)

SBB: Similar à instrução SUB, exceto que leva em conta o valor do carry.Serve para fazer cálculos com o método de “pedir emprestado”. Exemplos:

SBB C ; A = A-C-carrySBB L ; A = A-L-carrySBB M ; A = A-[HL]-carry

Page 11: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-11

SBI: Similar à instrução SUI, exceto que leva em conta o valor do carry.Serve para fazer cálculos com o método de “pedir emprestado”. Exemplos:

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

INR: Incrementa em uma unidade o valor do registrador especificado. Servepara implementar contadores. Exemplos:

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

Quando o valor do registrador é FF e usamos esta instrução, ele passará aficar com o valor 00 e o bit Carry será ligado. O bit Zero também seráligado, indicando que o resultado da operação foi zero.

DCR: Diminui de uma unidade o conteúdo do registrado especificado. Estainstrução é usada para implementar contagens decrescentes. Exemplos:

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

Quando o registrador tem o valor 1 e usamos esta instrução, o seu conteúdopassará a ser 00. O bit Zero será ligado, indicando que o resultado daoperação foi 0. Se o registrador estiver com o valor 00 e usarmos novamenteesta instrução, seu valor passará a ser FF. O bit Carry será ligado, paraindicar que o resultado tem valor negativo.

INX e DCX: Essas instruções são similares às instruções INR e DCR, excetoque operam com pares de registradores (BC, DE e HL) e com o StackPointer. Não podem ser usadas diretamente para implementar contadores,pois elas não afetam os valores dos flags, ou seja, não “avisam” se o resultadofoi zero, positivo ou negativo. Essas instruções não tinham objetivo de fazercontagem, mas sim de usar os registradores como ponteiros para a memória.Ao lançar o 8086, a Intel corrigiu este “deslize”. As instruçõescorrespondentes nos processadores de 16 bits afetam os valores dos flags, oque é importante para tomar decisões posteriores em função do resultado dacontagem. Exemplos:

Page 12: Cap08 - Arquitetura de Process Adores

8-12 Hardware Total

INX H ; HL = HL+1INX D ; DE = DE+1DCX B ; BC = BC-1INX SP ; SP = SP+1

Note que apesar do 8080 ser um processador de 8 bits, INX e DCX sãoconsideradas instruções de 16 bits.

DAA: Esta instrução é usada na manipulação de números codificados noformato BCD (Bynary Coded Decimal). Nesta representação, um valor de 8bits é dividido em 2 grupos de 4 bits. Um grupo de 4 bits representa o dígitodas unidades e o outro grupo representa o dígito das dezenas, no formatodecimal. Números neste formato podem ser somados e subtraídos pelasmesmas instruções que manipulam números binários. A única diferença éque no final da operação é preciso usar a instrução DAA para fazer o ajustedecimal. Por exemplo, se quisermos somar os números 48 e 36 (BCD),usamos as instruções comuns (ADD, ADI, etc.) e encontraremos o resultado7E (hex). Entretanto o resultado esperado, considerando o formado BCD,seria 84 (pensando em decimal). Logo após fazer a soma, se usarmos ainstrução DAA, aquele valor 7E resultará em 84.

DAD: Esta é uma operação de soma em 16 bits. Soma o valor de 16 bitspresente em HL com o par de registradores especificado. Este “par” pode serBC, DE, HL ou SP. O resultado é colocado em HL, e o bit Carry é afetado,refletindo um eventual “vai 1”. Exemplos:

DAD B ; HL = HL+BCDAD D ; HL = HL+DEDAD H ; HL = HL+HLDAD SP ;HL = HL+SP

Para exemplificar as instruções apresentadas até aqui, vamos mostrar umexemplo no qual movemos 30 bytes localizados a partir do endereço 1000hpara o endereço 2000h.

LXI H, 1000h ; HL vai apontar para a origemLXI D, 2000h ; DE vai apontar para o destinoMVI C, 30 ; C será usado como contador:

TRAN: MOV A,M ; Pega o byte da origemSTAD X ; Guarda no destinoINX H ; Aponta para o próximo byteINX D ; Aponte para o próximo byteDCR C ; Decrementa o contadorJNZ TRAN ; Vai para TRAN se não chegou a ZERO

Page 13: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-13

Além das instruções já conhecidas, estamos usando a instrução JNZ (Jump ifnot Zero). Este instrução é um exemplo de desvio condicional. O programacontinuará a partir do endereço TRAN caso o bit ZERO não esteja ativado,ou seja, se o resultado da operação anterior (C=C-1) não foi zero. Quando acontagem chegar a zero, a instrução JNZ não provocará o desvio, e oprograma continuará com a instrução seguinte.

Instruções lógicas

As instruções lógicas são necessárias para que os programas possam tomardecisões em função dos dados. São instruções que realizam operações AND,OR, XOR (ou exclusivo) e NOT (negação). Existem ainda instruções decomparação, instruções para manipular o bit carry e instruções para rotaçãode bits.

Para entender o funcionamento dessas instruções, temos que lembrar astabelas verdade dos operadores NOT, AND, OR e XOR:

X NOT X X Y X AND Y X Y X OR Y0 1 0 0 0 0 0 01 0 0 1 0 0 1 1

1 0 0 1 0 11 1 1 1 1 1

Como vemos na tabela acima, o operador NOT faz a inversão do bit sobre oqual atua. O operador AND dará resultado 1 apenas quando ambos os bitsforem 1, e dará 0 em caso contrário. O operador OR dará resultado 0somente quando ambos os bits forem 0. O operador XOR dará resultado 1se os dois bits forem diferentes, e 0 se ambos os bits forem iguais.

X Y X XOR Y0 0 00 1 11 0 11 1 0

Essas operações são envolvem apenas um bit, mas nas instruções lógicas dosprocessadores, atuam individualmente sobre cada um dos bits. Por exemplo,se calcularmos 10111110 AND 10010101, teremos o seguinte resultado:

1011111010010101 AND------------10010100

Page 14: Cap08 - Arquitetura de Process Adores

8-14 Hardware Total

Note que o primeiro bit do resultado é obtido fazendo a operação AND comos primeiros bits das duas parcelas, e assim por diante.

ANA e ANI: Realiza uma operação AND, bit a bit, do acumulador com oregistrador especificado. O resultado da operação fica no acumulador. Ainstrução ANI faz o AND do acumulador com um valor constante.

ANA B ; A = A AND BANA C ; A = A AND CANA A ; A = A AND AANA M ; A = A AND [HL]ANI 3Fh ; A = A AND 3F

Uma das várias aplicações desta instrução é testar se determinados bits sãozero ou 1. Por exemplo, se fizermos ANI 00000100b, podemos usar a seguiruma instrução JZ ou JNZ que causarão desvio ou não dependendo do fatodo bit 2 estar ligado ou desligado.

Chegou a hora de apresentar mais um conceito: a identificação dos bits. Emum grupo de 8 bits, chamamos cada um desses bits, da direita para aesquerda, 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 operação OR do acumulador com oregistrador especificado; ORI faz o mesmo com um valor constante; XRA faza operação XOR (OU Exclusivo) do acumulador com o registradorespecificado, XRI faz o mesmo com um valor constante. Exemplos:

XRA B ; A = A XOR BXRA C ; A = A XOR CORA L ; A = A XOR LORI 20h ; A = A OR 20hXRI 04h ; A = A XOR 04hXRA A ; A = A XOR A

Aproveitamos para mostrar alguns macetes de programação assembly. Ainstrução 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 instrução XRI fará a inversão do bit correspondente (useos mesmos valores que indicamos para a instrução ORI). A instrução XRAA tem o efeito de zerar o acumulador.

CMP, CPI: A instrução CMP compara o acumulador com outrosregistradores. A instrução CPI compara o acumulador com um valor

Page 15: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-15

constante de 8 bits. O resultado do acumulador não é afetado. As instruçõesapenas afetam os bits Zero e Carry. Após essas instruções podem ser usadosdesvios condicionais que testam esses dois bits. Esses bits ficarão ligados oudesligados de acordo com os valores comparados:

A maior que Valor Z=0 Cy=0A igual a Valor Z=1 Cy=0A menor que Valor Z=0 Cy=1 Exemplos:

CMP C ; Compara A com CCMP L ; Compara A com LCMP M ; Compara A com [HL]CPI 4Ch ; Compara A com 4C

RLC, RRC: Essas duas instruções são usadas para deslocar os bits doacumulador. RLC desloca para esquerda e RRC desloca para a direita. Aoperação é mostrada na figura 4.

Figura 8.4

Instruções RLC e RRC.

Na instrução RLC, cada bit assume o lugar do bit imediatamente à suaesquerda (ou seja, o bit imediatamente mais significativo). O bit 7 étransferido para o bit 0, e uma cópia do bit 7 é feita no Carry. Na instruçãoRRC, o deslocamento é feito de forma inversa. O bit 0 é copiado para o bit7 e para o Carry. Essas instruções têm diversas aplicações, entre as quais, aimplementação de operações de multiplicação e divisão, já que o 8080 nãoas possui no seu conjunto de instruções.

Essas instruções não têm parâmetros. São usadas simplesmente nas formasRRC e RLC.

RAL, RAR: Também fazem deslocamentos dos bits do acumulador, para aesquerda e para a direita. A diferença é que neste caso, a rotação é feita com

Page 16: Cap08 - Arquitetura de Process Adores

8-16 Hardware Total

9 bits, sendo 8 do acumulador e mais o Carry. A operação dessas instruçõesé mostrada na figura 5.

Figura 8.5

Instruções RAL e RAR.

CMA: Complementa o acumulador, ou seja, faz a inversão de todos os seusbits.

STC, CMC: Essas instruções servem para carregar valores no Carry. Ainstrução STC faz Carry=1, e a instrução CMC inverte o valor do Carry.Note que não existe uma instrução para zerar o Carry. Ao invés dela,podemos usar STC seguida de CMC, ou então usar a instrução ANA A ouORA A, que não alteram o valor de A mas zeram o Carry.

Instruções de desvio

As instruções de desvio são importantíssimas, e são executadas o tempotodo. O processador tende a seguir uma seqüência de instruções, na mesmaordem na qual são encontradas na memória, ou seja, depois de cadainstrução é executada a instrução seguinte. Um programa que só executainstruções na sequência não tem muita utilidade. Todos os processadoresprecisam de insruções de desvio, que fazem com que a execução sejacontinuada a partir de um outro ponto qualquer do programa. Já mostramosum exemplo de trecho de programa que usa a instrução JNZ (jump if notzero) para implementar a repetição de um trecho um certo número de vezes.Um trecho de programa que é executado diversas vezes é chamado deLOOP.

JMP: Esta é a principal e mais simples instrução de desvio. É o quechamamos de desvio incondicional, ou seja, sempre será executada, nãoimporta em que condições. Por exemplo, ao encontrar a instrução JMP8000h, o processador continuará a execução do programa a partir dasinstruções localizadas no endereço 8000h.

Page 17: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-17

CALL e RET: A instrução CALL também é um desvio, mas bem diferentedo JMP. É uma chamada de rotina. Uma rotina é um trecho de programaque pode ser chamado de vários pontos de um programa principal. No finalde uma rotina deve exitir uma instrução RET, que faz o processador retornarao ponto imediatamente após a instrução CALL.

Comparando as instruções CALL e JMP, a única diferença é que no caso dainstrução CALL, o endereço da próxima instrução (endereço de retorno) éguardado no topo da pilha. O valor do SP (stack pointer é atualizado parapermitir novos empilhamentos). A instrução RET simplesmente obtem oendereço no topo da pilha e o coloca em PC (Program Counter), fazendocom que a execução continue de onde parou.

Mostraremos novamente nosso pequeno trecho de programa que move umcerto número de bytes de uma parte para outra da memória, mas desta vezusando uma rotina. O trecho começa no endereço 1000, onde carregamos opar HL com o endereço da origem, DE com o endereço do destino e oregistrador C com o número de bytes (no caso são 16 bytes, quecorresponde a 10 em hexadecimal). A seguir é chamada uma rotina que estáno endereço 1020. Esta é a rotina responsável pela movimentação. Depoisque a rotina é chamada, a próxima instrução a ser executada é JMP 0, queestá no endereço 100A.

1000: 21 00 81 LXI H, 81001003: 11 00 82 LXI D, 82001006: 0E 10 MVI C,101008: CD 20 10 CALL 1020100A: C3 00 00 JMP 0...1020: 7E MOV A,M1021: 12 STAX D1022: 23 INX H1023: 13 INX D1024: 0D DCR C1025: C2 20 10 JNZ 10201028: C9 RET

Observe que a rotina de movimentação localizada no endereço 1020 égenérica. Ela pode mover dados entre duas posições quaisquer de memória,dadas por HL e DE. O número de bytes também pode ser qualquer (de 1 a255), e deve ser dado em C. Dizemos então que HL, DE e C são osparâmetros desta rotina.

É importante entender o que acontece com a stack ao executarmosinstruções CALL e RET. Na instrução CALL, o endereço de retorno eempilhado. Na instrução RET, o endereço de retorno é desempilhado. No

Page 18: Cap08 - Arquitetura de Process Adores

8-18 Hardware Total

trecho de programa mostrado acima, a instrução CALL causará oempilhamento do endereço 100A, que é o endereço da instrução seguinte, eserá o endereço de retorno.

Figura 8.6

Empilhamento de um endereço deretorno na stack, feito por uma instruçãoCALL.

A figura 6 ilustra o que está ocorrendo. Digamos que o registrador SP (StackPointer) esteja com o valor inicial 0100. A stack aumenta para trás, ou seja,para endereços menores. Ao executar a instrução CALL, o processadorempilhará o endrereço 100A nos bytes imediatamente anteriores aoendereço indicado por SP. Portanto ocupará os endereços 00FF e 00FE. OSP será atualizado para 00FE, que será o novo topo da pilha. Assim novosendereços poderão ser empilhados quando forem executadas outrasinstruções CALL.

A instrução RET fará exatamente o inverso do mostrado na figura 6. O StackPointer estará com o valor 00FE, portanto irá obter o endereço de retornonas posições 00FE e 00FF da memória, e encontrará 100A. O Stack Poitnerserá então atualizado para 0100, que será o novo topo da pilha.

JMPs, CALLs e RETs condicionais – Além das instruções JMP, CALL eRET, que são incondicionais, existem suas versões condicionais, que sãoexecutadas apenas quando uma determinada condição é satisfeita. Essascondições são baseadas nos flags: Zero, Carry, Parity e Signal. São elas:

Instrução Ação InterpretaçãoJZ Pula se Zero está ligado Pula se o resultado é zero,

Pula se iguaisJNZ Pula se Zero está desligado Pula se o resultado não é zero,

Pula se diferentesJC Pula se Carry está ligado Pula se menor, pula se carryJNC Pula se Carry está desligado Pula se maior ou igual, pula se não carryJPE Pula se paridade Par Pula se número de bits 1 é parJPO Pula se paridade Ímpar Pula se número de bits 1 é ímparJP Pula se sinal positivo Pula se resultado positivo ou zeroJM Pula se sinal negativo Pula se resultado negativo

Page 19: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-19

Nesta tabela mostramos a ação de cada uma desas instruções, e ainda umainterpretação dessas ações. Por exemplo, a instrução JZ pode ser usada logodepois uma operação aritmética e queremos que seja feito o desvio se oresultado foi zero. Pode ainda ser usada depois de uma comparação equeremos que o desvio seja feito se os valores comparados forem iguais.

Da mesma forma existem as chamadas condicionais de rotinas e os retornoscondicionais:

CZ, CNZ, CC, CNC, CPE, CPO, CP, CMRZ, RNZ, RC, RNC, RPE, RPO, RP, RM

RST n: Esta instrução é similar a uma instrução CALL. A diferença é queela não precisa que seja indicado o endereço, pois está implícito. Podemosusá-la de 8 formas diferentes:

RST 0 / RST 1 / RST 2 / RST 3 / RST 4 / RST 5 / RST 6 / RST 7

Essas instruções têm o mesmo efeito que:

CALL 0000 / CALL 0008 / CALL 0010 / CALL 0018 / … / CALL 0038

O objetivo dessas instruções é economizar bytes, já que ao invés dos 3 bytesocupados por uma instrução CALL, usa apenas um byte. Quando uma certarotina é usada muitas vezes em um programa, podemos colocá-la a partir deum desses endereços e chamá-las através das instruções RST. Note que essesendereços estão separados apenas por 8 bytes, portanto não é possívelcolocar diretamente neles, rotinas maiores que este tamanho. O quenormalmente fazemos é usar nesses endereços, instruções de JMP para outraárea onde ficam as rotinas.

PCHL: Carrega em PC o valor existente em HL. Isto é equivalente aexecutar um JMP para o endereço especificado por HL. É útil quandoqueremos desviar para um local variável, em função do valor em HL, obtidopor exemplo, de uma tabela de endereços.

Operações com a pilha, E/S e controle

Para completar o conjunto de instruções do 8080, falta apenas uma pequenamiscelânea de instruções para para manipulação da stack, entrada/saída econtrole.

Page 20: Cap08 - Arquitetura de Process Adores

8-20 Hardware Total

PUSH e POP: Já vimos como a stack é usada para emplilhar e desempilharendereços nas instruções CALL e RET. São sempre valores de 16 bits. Alémde endereços, podemos ainda empilar e desempilhar dados na stack. Porexemplo, a instrução PUSH H guardará o valor de HL no topo da stack. Ainstrução POP H fará o inverso, ou seja, retirará da pilha o valor do seu topoe o copiará para HL. As instruções PUSH e POP podem ser usadas com osparâmetros B, D e H, que operam com os pares BC, DE e HL. Podemosainda usar PUSH PSW, que salva em um grupo de 16 bits, o valor doacumulador e dos flags. A instrução POP PSW faz o inverso.

XTHL: Lembra da instrução XCHG, que troca os valores de HL e DE? Ainstrução XTHL faz algo parecido. Troca os valores de HL e do topo dapilha.

SPHL: Já vimos também a instrução “LXI SP, Valor”, que carrega um valorfixo no stack pointer. Isto é necessário na inicialização dos programas,quando temos que definir onde ficará a pilha. A instrução SPHL é maisflexível. Ela cria a stack em qualquer ponto da memória, bastando indicarseu endereço em HL.

IN, OUT: São instruções importantíssimas que servem para o processadortrocar dados com o mundo exterior. Através da instrução IN podemos obterdados provenientes de interfaces que estão ligadas aos periféricos. O dadolido ficará no acumulador. A instrução OUT faz o inverso, ou seja, transferepara o endereço de E/S especificado, o valor que está no acumulador.Exemplos:

IN 70h ; Lê dado que está no endereço de E/S 70hOUT 40h ; Envia para o endereço de E/S 40h, o valor de A

DI, EI: Essas instruções controlam as interrupções de hardware. DI faz comque as interrupções sejam desabilitadas. EI faz com que sejam habilitadasnovamente. São úteis durante o atendimento a interrupções de hardware eem certos trechos críticos que não podem ser interrompidos.

HLT: Halt. Faz o processador parar de executar instruções. O processadorsó sai deste estado quando ocorre uma interrupção.

NOP: No Oparation. Esta instrução não faz nada. É usada quando queremosfazer uma pausa entre duas instruções seguidas. Normalmente isso énecessário quando temos um programa que faz controle direto do hardware.

Page 21: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-21

Isto pode ser necessário, por exemplo, para fazer o processador esperar umpouco mais pela execução das funções de certos circuitos lentos.

Um pequeno programa para 8080

Finalizamos a apresentação das instruções do 8080, mostrando um pequenoprograma. Este programa faz o recebimento dos caracteres do teclado e oscoloca na memória a partir do endereço 1000h. O número máximo decaracteres que poderá ser recebido é 80. Quando terminarmos de digitar alinha, devemos teclar ENTER, cujo código hexadecimal é 0Dh. Estamossupondo aqui que o computador tem um console (teclado/vídeocombinados) ligado em uma interface serial que ocupa os endereços de E/S80h e 81h. O endereço 80h é a porta de dados, que envia caracteres do parao vídeo (escrita) e lê caracteres do teclado (leitura). A porta 81h é usadacomo status. Seus bits 0 e 1 indicam respectivamente se a interface tem umdado vindo do teclado e se está pronta para enviar um dado para o vídeo.

LXI H, 1000h ; Aponta para a área de memóriaMVI C,0 ; Zera o contador de bytes

LECH: CALL INCHAR ; Lê caractere do tecladoCPI 0Dh ; Testa se foi ENTERJZ FIM ; Vai para o fim se teclou ENTERMOV B,A ; Se não foi enter, guarda caracter em B MOV A,C ; Pega o contador de caracteresCPI 80 ; Testa se chegou a 80JZ LECH ; Se há chegarm 80, ignora e volta a lerMOV A,B ; Se não chegou a 80, pega o caracterMOV M,A ; Guarda caracter na memóriaCALL OUTCHAR ; Envia o caracter para o vídeoINR C ; Incrementa o contador de caracteresINX H ; Incrementa o ponteiroJMP LECH ; Vai ler o próximo caracter

FIM: JMP 0 ; Pula para 0000 quando terminar o programa; Rotina de leitura de caracter

INCHAR: IN 81h ; Lê o status da porta serialANI 01 ; Testa se o bit 0 está ligadoJZ INCHAR ; Se está desligado continua tentandoIN 80h ; Lê o código do caracterRET ; e retorna com o caracter em A

; Rotina que envia para o vídeo, caracter; que está em A

OUTCHAR: PUSH B ; Salva para BC na pilhaMOV B,A ; Guarda em B o caracter

OUTC1: IN 81h ; Lê o status da porta serialANI 02 ; Testa o bit 1JZ OUTC1 ; Se bit 1 está zerado, continua esperandoMOV A,B ; Pega o caracterOUT 80h ; Envia o caracter POP B ; Restaura o valor original de BCRET ; e retorna

Page 22: Cap08 - Arquitetura de Process Adores

8-22 Hardware Total

Códigos das instruções do 8080

Apresentamos a seguir uma tabela com os códigos de todas as instruções do8080. Não que você vá programar 8080, mas para que você tenha uma idéiada relação entre as instruções e os seus códigos. Na tabela que se segue,temos as seguintes convenções:

D8 representa um dado constante de 8 bits D16 representa um dado constante de 16 bits Addr representa um endereço de 16 bits

OpCode

MnemonicOpCode Mnemonic

OpCode

MnemonicOpCode

MnemonicOpCode Mnemonic

OpCode Mnemonic

00 NOP 2B DCX H 56 MOV D,M 81 ADD C AC XRA H D7 RST 201 LXI B,D16 2C INR L 57 MOV D,A 82 ADD D AD XRA L D8 RC02 STAX B 2D DCR L 58 MOV E,B 83 ADD E AE XRA M D9 -03 INX B 2E MVI L,D8 59 MOV E,C 84 ADD H AF XRA A DA JC ADDR04 INR B 2F CMA 5A MOV E,D 85 ADD L B0 ORA B DB IN D805 DCR B 30 - 5B MOV E,E 86 ADD M B1 ORA C DC CC ADDR06 MVI B,D8 31 LXI SP,d16 5C MOV E,H 87 ADD A B2 ORA D DD -07 RLC 32 STA ADDR 5D MOV E,L 88 ADC B B3 ORA E DE SBI D808 - 33 INX SP 5E MOV E,M 89 ADC C B4 ORA H DF RST 309 DAD B 34 INR M 5F MOV E,A 8A ADC D B5 ORA L E0 POR0A LDAX B 35 DCR M 60 MOV H,B 8B ADC E B6 ORA M E1 POP H0B DCX B 36 MVI M,D8 61 MOV H,C 8C ADC H B7 ORA A E2 JPO ADDR0C INR C 37 STC 62 MOV H,D 8D ADC L B8 CMP B E3 XTHL0D DCR C 38 - 63 MOV H,E 8E ADC M B9 CMP C E4 CPO ADDR0E MVI C,D8 39 DAD SP 64 MOV H,H 8F ADC A BA CMP D E5 PUSH H0F RRC 3A LDA ADDR 65 MOV H,L 90 SUB B BB CMP E E6 ANI D810 - 3B DCX SP 66 MOV H,M 91 SUB C BC CMP H E7 RST 411 LXI D,D16 3C INR A 67 MOV H,A 92 SUB D BD CMP L E8 RPE12 STAX D 3D DCR A 68 MOV L,B 93 SUB E BE CMP M E9 PCHL13 INX D 3E MVI A,D8 69 MOV L,C 94 SUB H BF CMP A EA JPE ADDR14 INR D 3F CMC 6A MOV L,D 95 SUB L C0 RNZ EB XCHG15 DCR D 40 MOV B,B 6B MOV L,E 96 SUB M C1 POP B EC CPE ADDR16 MVI D,D8 41 MOV B,C 6C MOV L,H 97 SUB A C2 JNZ ADDR ED -17 RAL 42 MOV B,D 6D MOV L,L 98 SBB B C3 JMP ADDR EE XRI D818 - 43 MOV B,E 6E MOV L,M 99 SBB C C4 CNZ ADDR EF RST 519 DAD D 44 MOV B,H 6F MOV L,A 9A SBB D C5 PUSH B F0 RP1A LDAX D 45 MOV B,L 70 MOV M,B 9B SBB E C6 ADI D8 F1 POP PSW1B DCX D 46 MOV B,M 71 MOV M,C 9C SBB H C7 RST 0 F2 JP ADDR1C INR E 47 MOV B,A 72 MOV M,D 9D SBB L C8 RZ F3 DI1D DCR E 48 MOV C,B 73 MOV M,E 9E SBB M C9 RET F4 CP ADDR1E MVI E,D8 49 MOV C,C 74 MOV M,H 9F SBB A CA JZ ADDR F5 PUSH PSW1F RAR 4A MOV C,D 75 MOV M,L A0 ANA B CB - F6 ORI D820 - 4B MOV C,E 76 HLT A1 ANA C CC CZ ADDR F7 RST 621 LXI H,D16 4C MOV C,H 77 MOV M,A A2 ANA D CD CALL Addr F8 RM22 SHLD ADDR 4D MOV C,L 78 MOV A,B A3 ANA E CE ACI D8 F9 SPHL23 INX H 4E MOV C,M 79 MOV A,C A4 ANA H CF RST 1 FA JM ADDR24 INR H 4F MOV C,A 7A MOV A,D A5 ANA L D0 RNC FB EI25 DCR H 50 MOV D,B 7B MOV A,E A6 ANA M D1 POP D FC CM ADDR26 MVI H,D8 51 MOV D,C 7C MOV A,H A7 ANA A D2 JNC ADDR FD -27 DAA 52 MOV D,D 7D MOV A,L A8 XRA B D3 OUT D8 FE CPI D8

Page 23: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-23

28 - 53 MOV D,E 7E MOV A,M A9 XRA C D4 CNC ADDR FF RST 729 DAD H 54 MOV D,H 7F MOV A,A AA XRA D D5 PUSH D2A LHLD ADDR 55 MOV D,L 80 ADD B AB XRA E D6 SUI D8

Observe que alguns códigos, ao serem recebidos pelo processador, nãorepresentam instrução alguma. No caso do 8080, esses códigos são:

08, 10, 18, 20, 28, 30, 38, CB, D9, DD, ED e FD.

Ao encontrar uma dessas instruções inválidas, o 8080 não fazia nada. Algunsciriosos descobriram que certos códigos inválidos eram na verdade instruçõesnão documentadas da Intel, porém nenhum programador sério ousavautilizá-las. Como eram instruções não oficiais, não era garantido que fossemimplementadas em todas as versões do processador. No 8085, uma evoluçãodo 8080, a Intel utilizou duas novas instruções: RIM (20h) e SIM (30h). AZilog utilizou esses códigos para usar com as novas instruções do seuprocessador Z80.

Nos processadores modernos, não é permitido executar instruções inválidas.Quando isso ocorre, o próprio processador gera uma interrupção e indicaoperação ilegal. No Windows, isso resulta em uma mensagem como: Erro oprograma xxxx executou uma operação ilegal em .....”

Linguagem Assembly do 8086Depois desta breve apresentação do assembly do processador 8080, estamosfinalmente entrando na era dos PCs, com o assembly do processador 8086.Os seus registradores internos são de 16 bits, mas foram inspirados nosregistradores do 8080. Na figura 7, os registradores indicados em branco são“herdados” do 8080, enquanto os indicados em cinza são novos, próprios do8086.

Page 24: Cap08 - Arquitetura de Process Adores

8-24 Hardware Total

Figura 8.7

Registradores internos do8086.

Os regisradores AX, BC, CX e DX são de 16 bits, mas podem ser tratadoscomo duas partes de 8 bits. AX é dividido em AH e AL, BX é dividido emBH e BL, e assim por diante. AX é o acumulador, portanto AL correspondeao registrador A do 8080. O registrador BX do 8086 corresponde ao par HLdo 8080 (assim como BH corresponde a H e BL corresponde a L). Damesma forma, CX corresponde ao par BC e DX corresponde ao par DE. Ocontador de programa (PC) do 8080 é chamado no 8080 de IP (InstructionPointer). O Stack Pointer (SP) é similar, e os flags (Cy, Z, AC, P e S) ficamem um registrador de flags, com 16 bits.

Esta correspondência entre os registradores do 8086 e do 8080 foi proposital.Permitiu que programas escritos em assembly do 8080 fossem rapidamenteconvertidos para o 8086, mesmo que não da forma mais eficiente. Porexemplo, as instruções MOV D,B / MOV E,C podiam ser diretamentetraduzidas por MOV DH,CH / MOV DL,CL. Entretanto é muito melhorusar os recursos de 16 bits, com a instrução MOV DX,CX. Depois deconverter os antigos programas assembly de 8080 para 8086, os produtoresde software passaram a criar programas novos já usando os recursos maisavançados do 8086, resultando em programas mais eficientes. Programas emlinguagem de alto nível (C, Pascal, etc.) podiam ser convertidos com maisfacilidade, já que eram desvinculados do assembly.

Novas instruções

Além de ter todas as instruções do 8080 ou instruções similares, o 8086trouxe novas instruções bem mais avançadas, com execução mais rápida.Alguns exemplos:

Page 25: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-25

Multiplicacão de números inteiros de 16 bits Divisão de números inteiros de 32 bits Rotações com qualquer número de bits Movimentação e comparação de strings Instruções para manipulação direta de bits Instruções de repetição

Registradores BX, BP, SI e DI

Esses registradores permitem várias operações comuns em outrosregistradores, e além delas, podem ser usados como índices. Por exemplo,podemos usá-los para apontar posições de memíria usando expressões como:

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

Exemplos:

MOV BX,1000h ; Aponta para o endereço 1000hMOV AL,[BX+15h] ; Lê para AL o valor que está em 1015hMOV BX,2000hMOV SI,100hMOV AL,[BX+SI+20h] ; Lê para AL o valor que está em 2120h

O uso de índices torna a programação extremamente mais simples quandotemos que lidar com estruturas de dados na memória, como strings ematrizes.

Registradores de segmento

O 8086 podia endereçar 1 MB de memória, muito mais que os 64 kBpermitidos pelo 8080. No 8080, toda a memória era tratada como uma únicacoleção de bytes, contendo instruções, dados e stack. No 8086, esseselementos também ficam nesta mesma memória, apesar de maior. Apesar damemória ser homogênea do ponto de vista físico, seu uso é dividido emáreas chamados segmentos. Instruções devem ficar no segmento de código,dados devem ficar no segmento de dados ou no segmento extra, e a stackdeve ficar no segmento de stack. Para manter essas 4 áreas de memóriadiferentes, o 8086 possui 4 registradores de segmento, que são:

CS: Code segment

Page 26: Cap08 - Arquitetura de Process Adores

8-26 Hardware Total

DS: Data segmentES: Extra segmentSS: Stack segment

Cada segmento no 8086 é uma área de memória com 64 kB. Osregistradores de segmento indicam o endereço inicial dos respectivossegmentos. Note que esses registradores têm 16 bits, enquanto os endereçosde memória do 8086 têm 20 bits. O processador obtém o endereço inicial decada segmento adicionando 4 bits zero (ou um dígito 0 hexadecimal) àdireita do valor existente no regitrador de segmento. Por exemplo, se oregistrador CS está com o valor 7BC3, então o segmento de dados começano endereço 7BC30.

Figura 8.8

Regitradores de segmento indicam osinícios dos respectivos segmentos.

A figura 9 mostra como é feito o endereçamento da memória dentro de umsegmento. Todos os acessos a instruções são feitas automaticamente nosegmento de dados. Digamos que CS esteja armazenando o valor 2800h, oque indica que o segmento de dados começa em 28000h. Digamos que oregistrador IP (Instriction Pointer) esteja com o valor 0153h. Para obter oendereço de memória, fazemos a seguinte conta: adicionar um zero à direitado valor do segmento e somar este resultado com o offset, que no caso é ovalor de IP. Encontramos então 28000h+0153h=28153h.

Page 27: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-27

Figura 8.9

Determinação de um endereço absoluto apartir do segmento e do offset.

Todos os endereços do 8080 são compostos desta forma. O endereço usadopara acessar a memória (de 00000 a FFFFF) é o que chamamos de endereçoabsoluto. O endereço absoluto sempre é formado por um valor de segmentoe um offset. O valor do segmento é adicionado de um zero hexadecimal àsua direita e somado com o valor do offset, resultando no endereço absoluto.

Vejamos um outro exemplo. Digamos que tenhamos DS=8A9Fh eBX=7CB6h. A instrução MOV AL,[BX] buscará um byte do endereçoabsoluto dado por:

8A9F0h +7CB6h = 926A6h

Observe que cada posição de memória pode ser endereçada de várias outrasformas. Por exemplo, o mesmo endereço absoluto 926A6H pode ser obtidofazendo DS=9000h e BX=26A6h.

Todas as instruções a serem executadas são buscadas no segmento decódigo, portanto o registrador CS é usado na determinação do endereçoabsoluto. Todos os acessos a dados são feitos no segmento de dados,portanto o processador usa o valor de DS no cálculo do endereço absoluto.Certas instruções que manipulam strings utilizam o segmento extra (ES é abase para o cálculo), e as operações com a stack são feitas no segmento destack, determinado por SS.

Usando 4 segmentos de 64kB (código, dados, stack e extra), somos levados aconcluir erradamente que um programa de 8086 pode ter no máximo 64 kB.Na prática não é isso o que ocorre. Para programas pequenos, não énecessário usar integralmente os 64 kB de cada segmento, portanto pode

Page 28: Cap08 - Arquitetura de Process Adores

8-28 Hardware Total

ocorrer interseção entre os segmentos. Além disso, instruções especiaisalteram automaticamente o valor de CS em operações de desvio e chamadasde rotinas, resultando em programas de maior tamanho, podendo até mesmousar toda a memória disponível. Um mesmo programa pode ter múltiplossegmentos de código e de dados, manipulando assim quantidades maioresde memória.

Modos de endereçamento

O 8086 possui vários modos de endereçamento:

Imediato: Opera com valores constantes. Exemplos:

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

Registrador: Quando envolve apenas registradores. Exemplos:

MOV AX,BX ; Copia BX em AXMOV CX,SI ; Copia SI em CXMOV DS,AX ; Copia AX em DSOR BX,CX ; Faz um “OR” de BX com CX. Resultado fica em BX

Direto: Qundo faz referência a um endereço fixo de memória. Exemplos:

MOV AX,[1000h] ; Carrega o valor do endereço 1000h em AL e do endereço 1001h em AHADD CX,[2000h] ; Carrega o valor de 16 bits dos endereços 2000h/2001h em CXCMP SI,[1020h] ; Carrega o valor de 16 bits dos endereços 1020h/1021h em SI

Indexado: Este é o modo de endereçamento mais flexível. Usa osregistradores BX, BP, SI e DI como índices. Os índices podem ser usadossozinhos ou combinados, ou seja, o valor da soma de BX ou BP com SI ouDI. 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]

Page 29: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-29

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

Note que não é permitido usar em uma única instrução, doisendereçamentos à memória. Por exemplo, não podemos usar MOV [SI],[DI].Apesar disso podemos mover dados entre quaisquer resitradores e quaisquerformas de endereçamento da memória (coisa que não era permitida no8080). No caso do 8086, existem algumas raras exceções. Por exemplo, nãopodemos usar livremente os registradores de segmento com todas asoperações que são suportadas pelos demais registradores. Não podemosusar, por exemplo, ADD DS,AX. Os registradores de segmento permitemapenas instruções de movimentação de dados.

Instruções de movimentação de dados

MOV: Move dados entre dois locais quaisquer. Podem ser usados nestainstrução, qualquer um dos modos de endereçamento já citados. Exemplos:

MOV AX,BXMOV DI,1000hMOV [BX+SI],20MOV CL,19MOV SI,[BX]MOV [BP+DI],CX

Note que o 8086 não tem instruções equivalentes a STAX e LDAX do 8080,que usam pares BC e DE para indexar a memória, já que não existem osmodos de endreçamento [CX] e [DX].

XCHG: No 8080 esta instrução permutava os valores de DE e HL. No 8086,quaisquer valores podem ser permutados, o que engloba todos osregistradores e a memória, endereçada por todos os modos válidos. Épermitido inclusive usá-la com elementos de 8 bits. Exemplos:

XCHG BX,DXXCHG AX,SIXCHG AL,BHXCHG CX,[BX+SI]

XLAT: Esta é uma instrução bastante especializada. É útil para implementartraduções de códigos. Digamos que tenhamos na memória uma tabela de256 valores, e queremos obter o valor desta tabela, cujo índice está em AL.A instrução XLAT faz isso, uma operação equivalente a MOV AL,[BX+AL].

Page 30: Cap08 - Arquitetura de Process Adores

8-30 Hardware Total

Instruções aritméticas

NEG: Inverte o sinal do valor aritmético especificado. Se o número forpositivo, tornar-se-a negativo, e vice-versa. Note que números negativosnecessitam de um bit (o mais significativo) para indicar o sinal, e os demaispara indicar a magnitude. Números com sinal armazenados em 8 bits podemportanto variar entre –128 e +127. Com 16 bits, variam entre –32.768 e+32.767.

NEG ALNEG AXNEG BXNEG DXNEG byte ptr [BX+SI]NEG word ptr [DI+4]

Estamos apresentando agora os prefixos byte ptr e word ptr. Esses prefixossão utilizados para informar ao assembler a real intenção do programador, seé acessar um dado de 8 ou de 16 bits. Por exemplo, na instrução MOV AL,[BX], o assembler sabe que o valor da memória a ser acessado é de 8 bits, jáque o outro operando é AL, que é também de 8 bits. Já em instruções comoNEG [BX], o assembler não saberia se a operação deve ser feita sobre o bytecujo endereço é dado por BX, ou se deve operar sobre os dois bytes (word)com este endereço. Usamos então os prefixos byte ptr e word ptr quandonecessário para dar esta informação ao assembler.

ADD, ADC: Soma os dois operandos. O resultado é colocado no primeirooperando. A operação pode ser feita com 8 ou 16 bits, dependendo dooperando. A instrução ADC soma os dois valores com o bit Carry, o que éusado para fazer o “vai 1”, agrupando dados de 16 bits para formar dadoscom maior número de bits. Exemplos:

ADD BX,SIADD AX,[BX+DI]ADD CL,AHADD DX,CXADD [SI],DXADC CX,[BX+SI]ADC AH,[BP+SI+3]ADC DX,BXADC [SI],AX

SUB, SBB: Essas duas instruções utilizam os mesmos operandos dasinstruções ADD e ADC. Fazem a subtração de valores. A diferença entreelas é que a SBB subtrai também o valor do bit Carry, tornando possível aoperação de “pedir emprestado”, o que é necessário para agrupar vários

Page 31: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-31

dados de 16 bits, manipulando assim números inteiros com maior número debits. Exemplos:

SUB BX,DXSUB CX,[BP+DI]SUB CH,DLSUB CX,AXSUB [SI],BXSBB AX,[BX+DI]SBB CX,[BP+SI+3]SBB CX,AXSBB [SI],CX

MUL, IMUL: São as duas instruções de multiplicação do 8086. Ambaspodem operar com 8 e 16 bits. A diferença é que MUL é usada paranúmeros sem sinal, somente positivos, enquanto IMUL aceita númerosinteiros, sejam positivos ou negativos. Nesta multiplicação, um dos fatores ésempre AX ou AL. O outro fator pode ser qualquer operando na memóriaou um outro registrador, com 8 ou 16 bits. Ao multiplicarmos dois valores de8 bits, o resultado é armazenado nos 16 bits de AX. Ao multiplicarmos doisvalores de 16 bits, o resultado é armazenado em 32 bits, ficando os 16 menossignificativos em AX e os 16 mais significativo em DX. Exemplos:

MUL CLMUL BXMUL byte ptr [SI]IMUL DXIMUL BXIMUL CL

DIV, IDIV: São as instruções de divisão. O dividendo pode ser de 16 ou 32bits. Se for de 16 bits, é usado o valor de AX. Se for de 32 bits, é usado ovalor obtido em DX e AX. O que definirá se o dividendo será de 16 ou 32bits é 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 número de 32 bits formado por DX eAX. O quociente ficará em AX e o resto em DX.

Note que esta instrução parte do princípio de que o resultado “caberá” noregistrador destinado ao quociente. Se não couber, ocorrerá um errochamado “estouro de divisão” (divide overflow). Por exemplo, ao fazer aconta 8000h dividido por 2, usando um divisor de 8 bits, o resultado será4000h, que não cabe em 8 bits. Para não passar por este problema é melhorfazer a mesma conta usando o divisor 2 com 16 bits (MOV CX,2 / DIV CX).Assim como ocorre nas instruções MUL e IMUL, a instrução DIV opera

Page 32: Cap08 - Arquitetura de Process Adores

8-32 Hardware Total

apenas com números inteiros positivos, e a IDIV opera tanto com positivosquanto com negativos.

INC, DEC: Incrementa de uma unidade e decrementa de uma unidade. Osbits Carry e Zero são afetados por essas operações, portanto podem serusadas para implementar contadores. Por exemplo, para preencher a tela deum terminal de vídeo com 2000 caracteres em branco, podemos usar oseguinte trecho de programa:

MOV DX,2000 ; Número de bytes a serem enviadosENVIA: MOV AL, 20h ; 20h é o código do caracter “espaço”.

CALL OUTCHAR ; Envia o caracter para o terminal de videoDEC DX ; Decrementa o contadorJNZ ENVIA ; Pula se não chegou a zero

Além de implementar contadores, as instruções INC e DEC também podemser usadas para implementar ponteiros para posições de memória, o que eútil quando queremos manipular dados seqüenciais.

Instruções lógicas

NOT: Inverte todos os bits do dado especificado. Cada bit 1 se transformaem 0, e cada bit 0 se transforma em 1. Exemplos:

NEG AXNEG SINEG DLNEG byte ptr [BX]NEG word ptr [BP+DI]NEG byte ptr [1000h]

AND, OR, XOR: São os tradicionais operadores lógicos “E”, “OU” e “OUExclusivo”. Não há necessidade de apresentar novamente a tabela verdadedesses operadores, já mostradas quando apresentamos as instruções do 8080.A diferença aqui é que essas operações podem ser feitas com 8 ou 16 bits, eos dois operandos podem ser quaisquer, desde que ambos sejam do mesmotipo (ou ambos são byte, ou ambos são word). O resultado da operaçãoficará armazenado no primeiro operando.

AND AX,SIAND CX,[BX+DI]AND DL,CHOR [SI],ALOR AX,1040hOR byte ptr[SI],20hXOR BX,DXXOR [SI+2],ALXOR AL,AH

Page 33: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-33

Shifts e Rotates

O 8086 tem diversas instruções para deslocar bits para a esquerda e para adireita. São chamadas de shifts e rotates. As instruções SHL e SHR sãoexemplos de shifts. Provocam o deslocamento de todos os bits para aesquerda e para a direita, respectivamente. Bits 0 são introduzidos à direita eà esquerda. A operação dessas duas instruções é mostrada na figura 10. Noteque no 8086, qualquer registrador ou posição de memória pode ser usadacom esta instrução. Podemos aplicar um deslocamento de um só bit ou demúltiplos bits, como mostraremos mais adiante.

Figura 8.10

Instruções SHL e SHR.

A diferença entre um shift e um rotate é que o shift introduz um bit 0 ou 1no no bit mais ou no bit menos significativo, como é o caso das instruçõesSHL e SHR mostradas na figura 10. Uma instrução de rotate forma umaespécie de “anel”, na qual o bit que sai em uma extremidade é recolocadona otura extremidade. A figura 11 mostra as instruções ROL e ROR (rotateleft e rotate right). O exemplo da figura mostra a rotação de valores de 8 bits,mas também podem ser usados operandos de 16 bits. Note que na instruçãoROL, o bit 7 é realimentado no lugar do bit 0. Na instrução ROR o bit 0 érealimentado no lugar do bit 7. Em ambas as instruções, o bit que érealimentado também é copiado no Carry. Este método de rotação é omesmo das instruções RLC e RRC do 8080.

Figura 8.11

Instruções ROL e ROR.

Page 34: Cap08 - Arquitetura de Process Adores

8-34 Hardware Total

As instruções RCL e RCR operam de forma similar, exceto pelo fato do bitCarry fazer parte da rotação, ao invés de simplesmente ficar com uma cópiado bit realimentado. A figura 12 mostra o funcionamento dessas duasinstruções, que são exemplos de rotates. Este é o mesmo método de rotaçãousado pelas instruções RAL e RAR do 8080.

Figura 8.12

Instruções RCL e RCR.

Finalmente apresentamos as instruções SAL e SAR, que também são shifts,da mesma forma como as instruções SHL e SHR já apresentadas. Note quedeslocar os bits uma posição para a esquerda, introduzindo zeros, equivale amultiplicar o valor por 2, e deslocar os bits uma posição para a direitaequivale a dividir o valor por 2. Isto funciona para números positivos, masquando os números podem ter sinal (o sinal é representado pelo bit maissignificativo; 1 significa negativo e 0 significa positivo), é preciso que asinstruções de shift preservem este sinal. Para isso servem as instruções SAL eSAR, que são chamados shifts aritméticos (assim como SHR e SHL sãochamados shifts lógicos). O funcionamento dessas duas instruções émostrado na figura 13.

Figura 8.13

Instruções SAL e SAR.

A instrução SAL é idêntica à instrução SHL, com a introdução de zeros. Já ainstrução SAR tem uma diferença. Ao invés de serem introduzidos zeros nobit mais significativo, este é realimentado em si próprio, ou seja, é copiadopara o bit seguinte mas o seu próprio valor permanece inalterado. Esta

Page 35: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-35

alteração permite que números negativos continuem negativos ao seremdeslocados para a direita (ou seja, divididos por 2).

Além da maior variedade de instruções de shifts e rotates, o 8086 permiteoperar não apenas com o acumulador, mas com qualquer outro registrador(exceto registradores de segmento), de 8 ou 16 bits. Também pode operarcom posições de memória, de 8 ou 16 bits. Uma outra diferença importanteé que o deslocamento pode ser feito apenas uma posição (comoexemplificado nas figuras), ou com múltiplas posições. Por exemplo,podemos deslocar um valor 3 bits para a esquerda, o que equivale a usar 3vezes consecutivas a mesma instrução. Para aplicar shifts e rotates múltiplos,basta carregar no registrador CL, o número de vezes que os bits devem serdeslocados. Exemplos:

SHR AX,1 ; Aplica um shift para a esquerda em AX, de 1 bit.MOV CL,4 ; Prepara CL com o número de bits a serem deslocadosROR BX,CL ; Roda BX 4 bits para a direitaSHL DL,1 ; Aplica um shift em DL de 1 posição para a esquerda

Desvios

As instruções de CALL, RET e JMP presentes no 8080 também estãopresentes no 8086. Também temos as formas condicionais da instrução JMP,mas não temos formas condicionais das instruções CALL e RET. Porexemplo, não existe a instrução RC (Return if Carry), como no 8080. No seulugar temos que fazer uma combinação das instruções JNC e RET.

As formas condicionais da instrução JMP estão representadas na tabela quese segue:

Page 36: Cap08 - Arquitetura de Process Adores

8-36 Hardware Total

Note que muitas instruções possuem aliases, ou seja, sinônimos. Porexemplo, “pule se menor ou igual” é a mesma coisa que “pule se não émaior”, portanto existem duas instruções idênticas: JBE e JNA (jump if belowor equal / jump if not above).

Uma outra instrução interessante é LOOP. Esta instrução faz o seguinte:decrementa o valor de CX, e se este registrador não chegou a zero, faz odesvio para um label especificado. Por exemplo:

MOV CX,10 ; Contador para 10 vezesMOV SI,1000 ; SI aponta para endereço 1000 da memóriaMOV DI,2000 ; DI aponta para 2000

TRANSF: MOV AL,[SI] ; Pega um byte da origemMOV [DI],AL ; Guarda no destinoINC SI ; Incrementa ponteirosINC DILOOP TRANSF ; Decrementa CX e se não chegou a zero vai para TRANSF

Neste pequeno trecho de programa as 4 instruções MOV AL,[SI] / MOV[DI],AL / INC SI / INC DI será executado 10 vezes, que é o valor inicial docontador CX. Observe que este exemplo é meramente explicativo, já queexiste uma única instrução que faz tudo isso sozinha (REP MOVS), comoveremos mais adiante. O objetivo deste exemplo foi mostrar como ainstrução LOOP pode ser usada para implementar repetições.

Existem ainda as formas condicionais da instrução LOOP, que são LOOPE eLOOPNE (ou LOOPZ e LOOPNZ). Essas instruções fazem previamente um

Page 37: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-37

teste no bit Zero, e executação uma instrução LOOP caso a condição sejasatisfeita. Se a condição não for satisfeita, o loop será terminado. Podemosusar os loops condicionais para fazer uma comparação ou finalizar umacontagem antes imediatamente antes do final do loop, permitindo assim queo loop possa ser finalizado mesmo que o contador não tenha chegado a zero.

Existe ainda a instrução JCXZ (jump if CX=0). Como o nome já diz, estainstrução executa um desvio caso o valor de CX tenha atingido o valor zero.Note que esta instrução, a instrução LOOP e suas formas condicionais, e asinstruções de shifts e rotates que podem usar em CL o número de bits aserem deslocados, dão ao registrador CX uma espécie de “personalidade”.Este registrador é usado como contador em todas essas instruções citadas, eem outras que ainda vamos apresentar.

Rotinas e retornos

Como já abordamos, as instruções de chamadas e retornos de rotinas sãoCALL e RET, e não possuem formas condicionais. Existem entretanto outrasinstruções de chamadas e retornos.

A instrução INT é uma espécie de “interrupção de software”. Normalmenteé usada para serviços do sistema operacional. Os primeiros 1024 bytes damemória são reservados para uma área chamada vetor de interrupções. Estevetor tem 256 elementos, e cada um desses elementos é composto de 4bytes, sendo 2 para indicar um segmento e 2 para indicar um offset. Cadaum desses 256 elementos é o endereço de uma função do sistemaoperacional encarregada de um determinado serviço. Cabe ao produtor dosistema operacional estipular como essas 256 interrupções serão usadas. Porexemplo, no MS-DOS, a instrução INT 21h é usada para várias chamadas defunções básicas de acesso a disco e E/S em geral.

Quando uma instrução CALL é executada, o endereço de IP é armazenadona stack. A operação inversa é feita pela instrução RET. Quando umainstrução INT é executada, os valores de CS e IP são armazenados na stack,já que serão carregados com novos valores encontrados no vetor deinterrupções. O final de uma rotina de interrupção, seja ela de software oude hardware, tem que terminar com uma instrução IRET. A diferença é queIRET obtém da stack, valores de CS e IP, enquanto uma instrução RETcomum obtém apenas o valor de IP.

Manipulação da stack

Page 38: Cap08 - Arquitetura de Process Adores

8-38 Hardware Total

As instruções PUSH e POP são utilizadas respectivamente para armazenar erecuperar valores de 16 bits na pilha. Todos os registradores de 16 bitspodem ser usados com essas instruções, bem como dados de 16 bits damemória. As instruções PUSHF e POPF são usadas para salvar e recuperar oregistrador de flags. Exemplos:

PUSH BXPUSH SIPUSH BPPUSH DSPOP AXPOP CXPOPF

Interrupções e E/S

Várias instruções são usadas para o processador interagir com o hardware.As instruções STI e CLI são hadas para habilitar e desabilitar interrupções.Instruções IN e OUT fazem operações de entrada e saída com 8 ou 16 bits.Nas instruções de 8 bits é usado o registrador AL, e nas instruções de 16 bitsé usado o registrador AX. Exemplos:

IN AL,80h ; Lê porta de 8 bits no endereço 80hIN AX,60h ; Lê porta de 16 bits no endereço 60hOUT 43h,AL ; Envia dado de AL para a porta 43hOUT 40h,AX ; Envia AL para a porta 40h e AH para a porta 41h

Usadas neste modo, as instruções IN e OUT permitem endereçar portas nafaixa de endereços de 00 a FF. Para endereçar portas em todo o espaço deendereçamento do processador (0000 a FFFF) é preciso colocar em DX oendereço da porta a ser acessada. Exemplos:

MOV DX,3F0h ; DX aponta para a porta 3F0IN AL,DX ; Lê o valor da porta 3F0MOV DX,278h ; Aponta para a porta 278hOUT DX,AL ; Envia dado de AL para a porta 278h

Manipulação de strings

O processador 8086 e seus sucessores têm a capacidade de manipular strings,que são cadeias de caracteres. Essas funções são importantes emprocessadores de texto e compiladores. Em todas as instruções de strings, osregistradores SI e DI apontam para as strings envolvidas. SI aponta para aorigem, localizada no segmento de dados. DI aponta para a string destino,localizada no segmento Extra. Portanto as strings de origem e destino estãoem CS:SI e ES:DI, respectivamente. O registrador CX é usado como

Page 39: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-39

contador, e AL ou AX são usados para manter o dado nas operações debusca, leitura e escrita.

MOVSB e MOVSW – Move um dado (8 ou 16 bits) da origem para odestino. MOVSB opera com bytes, e é equivalente à seguinte seqüência:

MOV dado8,DS:[SI]MOV ES:[DI],dado8INC SIINC DI

MOVSW opera com dados de 16 bits, e é equivalente à seqüência

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

Se quisermos que seja movido um certo número de bytes, podemos usar umcontador e decrementá-lo após a instrução MOVSB ou MOVSW, e voltar àinstrução se o contador não chegou a zero. Podemos usar a instrução LOOPpara este fim, que decrementa CX e faz o desvio caso não tenha chegado azero. Melhor ainda, podemos usar o prefixo REP antes da instrução. Parausar este prefixo, carregamos em CX o número de vezes que a instruçãodeve ser executada. Usamos então essas instruções nas formas:

REP MOVSBREP MOVSW

Observe que o prefixo REP faz com a que a instrução seguinte sejaexecutada CX vezes, mas este prefixo só pode ser usado em operações comstrings.

Outras operações com strings são:

LODSB e LODSW: Carrega em AL ou AX o dado apontado por DS:SI. Oregistrador SI é incrementado de 1 ou 2 unidades dependendo de ser aoperação 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 operações de 8 ou 16 bits,respectivamente. Aliado ao prefixo REP, essas instruções permitempreencher uma área de memória com um valor constante.

Page 40: Cap08 - Arquitetura de Process Adores

8-40 Hardware Total

SCASB e SCASW: Compara AL ou AX com o valor da memória apontadopor ES:DI. O registrador DI é somado com 1 ou 2 para operações de 8 ou16 bits. O flag Zero é ligado de acordo com o resultado da comparação,portanto logo após uma instrução SCASB ou SCASW podemos usar umdesvio condicional para indicar se o valor de AL ou AX foi “encontrado” ounão na memória.

CMPSB e CMPWS: Compara os dados apontados por DS:SI e ES:DI. Osflags são ligados de acordo com a comparação, portanto podemos usardepois dessas instruções, um desvio condicional. Os ponteiros SI e DI sãoatualizados. Essas instruções permitem achar uma string dentro de uma áreade memória. É o que ocorre quando usamos em um processador de textos, ocomando Localizar.

Outras instruções

O 8086 tem muitas outras instruções. Optamos por não apresentar todas aquipara não tornar o capítulo muito complexo. Você pode obter no site da Intel(www.intel.com), o manual completo da linguagem assembly dosprocessadores modernos. A diferença é que existem novas instruções,sobretudo aquelas para manipular valores de 32 bits. Mesmo não sendototalmente completa, esta apresentação resumida atendeu ao nosso objetivode mostrar como o processador opera internamente e como os programassão executados.

Arquitetura do 80286O 80286 também é um processador de 16 bits. Possui os mesmosregistradores internos existentes no 8086. Entretanto possui algumas novasinstruções, bem como um novo modo de endereçamento capaz de operarcom 16 MB de memória, o que era uma quantidade espantosa para a épocado seu lançamento (1982), quando a maioria dos computadores tinha 64 kBde memória. O 80286 podia operar em duas modalidades. O chamadomodo real (8086 real address mode) permite endereçar até 1 MB dememória. Nesse caso o processador comporta-se como um 8086, apenasacrescido de algumas novas instruções. Para uso em sistemas operacionaismais avançados, o 80286 podia operar no modo protegido (protected virtualaddress mode). Neste modo, o processador pode operar com 16 MB dememória física e até 1 GB de memória virtual por tarefa.

Multitarefa

O 80286 foi criado visando facilitar a multiprogramação ou multitarefa, naqual vários programas podem ser executados “simultaneamente”. O que

Page 41: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-41

ocorre é uma divisão do tempo entre os vários processos que estão sendoexecutados. Uma forma simples de dividir o tempo é alocar períodos iguais(10 milésismos de segundo, por exemplo), e distrubuir esses períodos entreos processos. Quando um processo começa a ser executado, seráinterrompido 10 ms depois, e o sistema operacional deve fazer com que oprocessador dê atenção ao processo seguinte. Desta forma usando umesquema de “rodízio”, todos os processos são executados ao mesmo tempo,porém em cada instante um só está efetivamente em execução, e os demaisestão aguardando. O período no qual o processador está dedicado a umprocesso é chamado time slice.

Existem outros esquemas mais sofisticados para implementar a multitarefa.Processos podem ter prioridades diferentes e time slices diferentes, visandoaumentar a eficiência. Um processo que faz muitas operações de E/S tende anão utilizar integralmente seu time slice, já que freqüentemente precisa parare aguardar pela operação de E/S (a leitura de um arquivo do disco, porexemplo). Este tipo de processo é classificado como “I/O bounded”. Poroutro lado, processos que fazem poucas operações de E/S e realizam muitoprocessamento são chamados de “CPU bounded”. Esses processos tendem autilizar integralmente o seu time slice. Visando aumentar a eficiênica, osistema operacional pode reduzir o time slice e aumentar a prioridade paraos processos “I/O bounded”. Pode ainda aumentar o time slice e reduzir aprioridade para os processos “CPU bounded”. Enfim, o sistema operacionalpode alterar as prioridades e a duração do time slice para que o trabalho doprocessador seja distribuído uniformemente entre os vários processos.

Novas instruções do 80286

As novas instruções incorporadas a este processador podem, em sua maioria,ser utilizadas tanto no modo real como no modo protegido. Apenas comoreferência rápida, citaremos algumas delas:

PUSHA e POPA: Realizam operações de PUSH e POP com todos osregistradores do processador. Essas instruções tornam mais rápida aoperação de salva e restauração de contexto, necessária nas entradas e saídasde rotinas e nas mudanças entre uma tarefa e outra.

IMUL: No 8086 esta instrução fazia a multiplicação de AL ou AX por umregistrador de 8 ou 16 bits. No 80286, esta instrução também pode operarcom 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.

Page 42: Cap08 - Arquitetura de Process Adores

8-42 Hardware Total

Shifts e Rotates: No 8086 essas operações eram feitas com 1 bit ou commúltiplos bits, mas era preciso carregar em CL o número de bits a seremdeslocados. No 80286 o valor pode ser usado diretamente na instrução. Porexemplo: SHR AX,3

INSB, INSW, OUTSB, OUTSW: São versões mais avançadas dasinstruções IN e OUT. Agora essas instruções operam com strings. Portanto épossível, por exemplo, enviar para um endereço de E/S uma seqüência dedados da memória. O prefixo REP e o contador CX podem ser usados paraespecificar o número de transferências a serem realizadas.

ENTER e LEAVE: Essas novas instruções são usadas para implementarrotinas em linguagens de alto nível. A instrução ENTER cria o quechamamos de stack frame, no qual ficam armazenados parâmetros evariáveis locais da rotina. A instrução LEAVE realiza o proceso inverso.Essas duas novas instruções tornaram o uso de rotinas em assembly maisadequado ao método usado pelas linguagens de alto nível, além de permitiruma entrada e saída mais rápida das rotinas.

BOUND: Essa instrução checa se o índice de um array está entre os limitesmáximo e mínimo permitidos pelo array. O array nada mais é que um vetorna memória. Por exemplo, se temos um array A com índices de 0 a 10, seuselementos são A[0], A[1], A[2], .... , A[10]. Se tentarmos usar uma expressãocomo A[30], um programa em linguagem de alto nível deverá ser suspensocom a apresentação da mensagem de erro “Invalid index”. Certas linguagensnão testam índices inválidos e cabe ao programador garantir que o índice éválido. Outras linguagens monitoram os índices durante a execução, mas istoresulta em mais tempo gasto. A instrução BOUND permite fazer a checagemdos índices em tempo de execução, de forma mais rápida.

Instruções para o modo virtual: O 80286 possui várias instruções queservem para que o sistema operacional faça o gerenciamento da memória edas 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 secomportar como um 8086, endereçando apenas 1 MB de memória. É apenasacrescido das novas instruções adicionadas ao conjunto de instruçõesoriginais do 8086, exceto aquelas usadas para gerenciamento de tarefas. Porisso é quase certo dizer que o 80286 operando em modo real é equivalenteao 8086. Alguns dizem que isso é “o mesmo que um XT”. É mais ou menos

Page 43: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-43

isso o que acontece, mas devemos lembrar que o 8086, 8088 e 80286 sãoprocessadores, e o XT é um computador. Seria correto dizer que no modoreal, o 80286 opera como um 8086 acrescido de instruções novas comoBOUND, ENTER, LEAVE, INSB, INSW, OUTSB, OUTSW, novos shifts,rotates e a nova instrução IMUL, além das instruções PUSHA e POPA.Entretanto muitos programadores optavam por não utilizar essas novasinstruções, para que seus programas fossem compatíveis com o IBM XT.Alguns programas tinham versões para XT e versões otimizadas para 80286,que usavam essas novas instruções. Apenas no final dos anos 80, quando oAT-286 era mais comum que o XT, surgiram programas que rodavamsomente no 286, utilizando essas novas instruções.

Modo protegido

O 80286 passa a ter novos recursos para gerenciamento de tarefas eendereçamento de memória quando opera no modo protegido. Lembre queno 8086, cada segmento tinha 64 kB, e era definido pelos registradores desegmento (CS, DS, ES e SS). Todos os segmentos eram contidos dentro damemória física de 1 MB. No 286 operando em modo protegido, ossegmentos também têm 64 kB, e são definidos por um registrador desegmento (CS, DS, ES e SS) e um offset. A diferença está na formação dessesendereços. Consideremos por exemplo o endereço F000:1000 no modo real.Conforme mostramos neste capítulo, o endereço absoluto correspondente éF1000. É obtido acrescentando um zero hexadecimal (ou 4 zeros binários) àdireita do segmento e somando o resultado com o offset. O resultado terá 20bits, permitindo endereçar até 1 MB.

No modo protegido, os endereços também são indicados por um valor desegmento e um valor de offset. A diferença é que o valor do segmento não éusado diretamente na formação do endereço. Ele é usado como índice emuma tabela chamada segment descriptor table. A partir do valor dosegmento é determinado o elemento da tabela que traz o endereço real dosegmento desejado, com 24 bits. Este valor é somado com o offset,resultando em um endereço físico de 24 bits, permitindo assim endereçar até16 MB de memória.

As tarefas (tasks) no 286 recebem um identificador de privilégio que varia de0 a 3. O privilégio 0 é dado ao núcleo do sistema operacional. É o úniconível que permite gerenciar parâmetros das demas tarefas, tendo acesso atodas as instruções de gerenciamento de memória e de tarefas. Os níveis deprivilégio 1 e 2 são usados pelo sistema operacional, e o nível 3 é dado àsaplicações. Isso impede que um programa de um usuário possa interferir

Page 44: Cap08 - Arquitetura de Process Adores

8-44 Hardware Total

com o gerenciamento de memória e de tarefas. Note que esses recursos sóestão disponíveis no modo protegido.

O pouco uso do modo protegido do 286

Apesar do 286 ter sido lançado em 1982 e bastante avançado para a suaépoca, quase sempre este processador era usado no modo real. Esteprocessador começou a ser desenvolvido no final dos anos 70, e até o seulançamento, ocorreu uma verdadeira reviravolta na indústria demicrocomputadores:

a) Transição entre os micros de 8 e de 16 bitsb) Lançamento do IBM PCc) Lançamento do MS-DOSd) Consolidação do IBM PC e do MS-DOS no mercado de micros

O modo real é bastante limitado. Lembra muito a operação dosprocessadores de 8 bits. Já o modo protegido tem características decomputadores mais poderosos. Recursos antes encontrados apenas emcomputadores de grande porte passariam a fazer parte dosmicrocomputadores. Era tido como óbvia a criação de novos sistemasoperacionais mais avançados, operando em modo protegido. Tudo indicavaque esses novos sistemas operacionais tomariam o lugar do arcaico DOS demodo real, que não passava de uma herança do sistema operacional CPM,usado nos micros de 8 bits desde os anos 70. Seriam criados sistemas maispoderosos, e o 80286 era um processador com recursos avançados paraatender a esses novos sistemas.

Não foi bem isso o que ocorreu. O IBM PC passou a ser cada vez maisusado, até chegar ao ponto em que microcomputador passou a ser sinônimode IBM PC. O número de PCs aumentou ainda mais depois que surgiram osclones, ou seja, PCs similares produzidos por outros fabricantes. Ao lado doPC, o sistema operacional MS-DOS com toda a sua limitação tornou-se maisutilizado que todos os demais sistemas operacionais.

Quem poderia imagiar, durante o projeto do 286, que o arcaico MS-DOSfaria tanto sucesso durante tantos anos? Por isso o 286 não foi projetado sobmedida para o MS-DOS, e sim para sistemas mais avançados. Apesar de umPC equipado com um 286 de 6 MHz ser quase 6 vezes mais veloz que umXT, o MS-DOS não podia fazer uso dos 16 MB (memória estendida) dememória que o 286 era capaz de endereçar. O 286 só oferece 16 MB nomodo protegido, e o MS-DOS só opera no modo real.

Page 45: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-45

Visando vencer esta dificuldade, a Lotus, a Intel e a Microsoft criaram umaespecificação de memória chamada EMS (Expanded Memory Specification),também conhecida como memória expandida. Consiste em uma placa dememória com circuitos de controle que permitiam acessar maioresquantidades de memória no modo real, usando um mecanismo dechaveamento de bancos de memória. A memória expandida foi muito maisusada que a estendida, que só estava disponível no modo protegido.

Placas de CPU 286 com suporte para mais de 1 MB de memória podiamoperar com memória estendida se fosse usado um sistema operacional demodo protegido. Essas placas também possuíam circuitos de controle quetransformavam sua memória acima de 1 MB em memória EMS, permitindoo seu acesso pelos programas do MS-DOS.

Um outro problema agravava a situação do 286. Uma vez entrando emmodo protegido, não poderia retornar ao modo real, a menos que oprocessador sofresse um RESET. Uma análise precipitada poderia nos levara pensar que isso foi um erro de projeto da Intel. Lembre-se entretanto que o286 foi lançado em 1982, e naquela época o IBM PC não era o computadormais comum no mercado, nem o MS-DOS era o sistema operacional maisusado, e a evolução da tecnologia apontava para o uso de novos sistemasoperacionais de modo protegido. Para que então um processador precisariair e voltar entre o modo real e o modo protegido? Afinal não existiamsistemas mistos. Ou eram de modo real (MS-DOS e CPM-86, por exemplo)ou de modo protegido. A própria IBM, na época, havia comprado parte daIntel, e nos seus planos estava o sistema operacional OS/2 (modo protegido)que cairia como uma luva no 286.

O processador 80386, lançado em 1985, foi projetado dentro de umarealidade em que o PC dominava o mercado, assim como o MS-DOS. Seuprojeto levou em conta esses fatores, e mudanças foram feitas nos seusmodos de endereçamento, como veremos a seguir.

Arquitetura do 80386É muito importante conhecer bem o 386, pois todos os processadoresposteriores, do 486 ao Pentium 4, utilizam métodos semelhantes degerenciamento de memória e multitarefa, bem como possuem conjuntos deinstruções similares, com apenas algumas poucas diferenças.

A figura 14 mostra o diagrama interno do 386. Além de vários elementosencontrados em outros processadores, destacam-se as unidades de

Page 46: Cap08 - Arquitetura de Process Adores

8-46 Hardware Total

gerenciamento de memória (segmentation unit e paging unit) e a unidade deproteção (protection test unit), necessária ao funcionamento da multitarefa.

*** 100% Figura8.14

Diagrama interno doprocessador 80386.

Registradores internos do 386

O 80386 é um processador de 32 bits. Para que fosse mantida acompatibilidade com o 8086 e com o 80286, cada registrador de 32 bits podeser também acessado em modos de 16 e de 8 bits. Por exemplo, oregistrador EAX tem 32 bits, mas seus 16 bits menos significativos são opróprio registrador AX do 8086 e 80286, bem como os 8 bits menossignificativos são o registrador AL.

Figura8.15

Registradores do80386.

Os registradores AX, BX, CX, DX, SI, DI, BP e SP foram todos expandidospara 32 bits. Os registradores de segmento CS, SS, DS e ES também estãopresentes e são de 16 bits. Foram adicionados mais dois registradores paraapontar para segmentos de dados: FS e GS. O contador de instruções (IP),

Page 47: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-47

que antes tinha 16 bits, agora tem 32 bits, e novos flags resultaram noaumento do registrador de flags também para 32 bits.

Novas instruções do 80386

Somente pelo fato dos registradores serem agora de 32 bits, o 80386 ganhouvárias novas instruções. Todas as instruções que operavam com 8 e 16 bits,agora operam também com 32 bits. Por exemplo, podemos manter númerosde 32 bits nos registradores EAX e EBX e usar a instrução ADD EAX,EBX,obtendo um resultado de 32 bits. No 8086 e no 80286, uma soma de 32 bitstinha que ser feita em duas etapas.

Além da maioria das instruções antigas agora poderem também operar com32 bits, existem várias instruções novas. A maioria delas são aplicadas aogerenciamento de tarefas e ao gerenciamento de memória. São portantoinstruções para serem usadas pelo sistema operacional, e não pelosprogramas comuns.

Foram ainda criados novos modos de endereçamento mais poderosos.Podemos por exemplo usar agora outros registrdores como EAX, EDX eECX para apontar a memória, coisa que não era permitida no 8086 nem no80286. Podemos usar endereçamentos dados por expressões como[EDX*8+EAX] e expressões similares, permitindo o endereçamento maisrápido de matrizes, como por exemplo, uma área de memória de vídeo ondeestá sendo desenhado um gráfico. Desta forma é possível manipularestruturas de dados mais complexas utilizando um reduzido número deinstruções.

Existem ainda algumas novas instruções para manipulação de valoresbinários, mas não apresentam grande impacto sobre o desempenho. O pontoforte para os programas comuns é realmente o “upgrade” das antigasinstruções de 16 bits para 32 bits. Essas novas instruções de 32 bits podeminclusive ser usadas (exceto as de endereçamento) quando o processadoropera no modo real, no qual seu comportamento é similar ao de um 8086.

Modo real

No modo real, o esquema de enereçamento do processador é similar ao do8086. Além disso não estão disponíveis os recursos avançados deendereçamento e gerenciamento de memória, nem de multitarefa. Estãoentretanto disponíveis as novas instruções que manipulam dados e 32 bits enovos modos de endereçamento de memória.

Page 48: Cap08 - Arquitetura de Process Adores

8-48 Hardware Total

Os endereços no modo real são formados a partir de um segmento e offset,ambos de 16 bits. O valor existente no registrador de segmento é adicionadode 4 bits “0” e somado com o offset. O resultado é o endereço efetivo de 20bits, usado para acessar a memória física. Neste modo é possível acessar até1 MB de memória, e cada segmento tem 64 kB. Exatamente como no 8086.

Figura 8.16

Endereçamento no modo real.

Assim como ocorreu no 286, o modo real do 386 foi criado para oferecercompatibilidade com os programas escritos para o 8086, como o DOS e seusaplicativos. O modo real está presente também nos processadores modernos,por isso é possível executar um boot com um disquete de DOS em um PCequipado com o Pentium 4 e usar programas de modo real.

Modo protegido

Além da velocidade resultante do maior clock e de operar diretamente comdados de 32 bits, o 80386 tem a grande vantagem de operar no modoprotegido, possibilitando acessar grandes áreas de memória e permitir amultitarefa. Os valores de offset podem ter 16 ou 32 bits, permitindo formarsegmentos de 64 kB e de 4 GB. Graças ao endereçamento com offsets de 32bits, um programa poderia teoricamente ocupar toda a memória física de umprocessador 386.

O endereçamento com offsets de 32 bits é possível graças aos novosregistradores de 32 bits. Observe na figura 15 que todos os registradoresusados para endereçar a memória agora têm 32 bits: AX, BX, CX, SI, DI,BP, SP e IP.

Page 49: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-49

Figura 8.17

Endereçamento de memória no modo protegido.

A figura 17 mostra a formação de um endereço no modo protegido. Umendereço de memória é formado a partir de um segmento e de um offset. Ovalor do segmento (CS, DS, ES, SS, FS ou GS) tem 16 bits, mas ao contráriodo que ocorre no modo real, não é simplesmente adicionado de zeros esomado com o offset. Este valor é usado como índice para uma tabela namemória (segment descriptor table), na qual é obtido o endereço verdadeiro.Este valor tem 32 bits e permite assim definir um segmento em qualquerlocal da memória física de 4 GB. O endereço do início do segmento ésomado com o offset de 16 ou 32 bits, formando assim segmentos de 64 kBou de 4 GB.

Segmentação, paginação e memória virtual

Na verdade o mecanismo de endereçamento é ainda mais complexo. Oendereço de 32 bits usado para acessar a memória de 4 GB é chamado deendereço linear. Uma vez formado, este endereço pode ser enviadodiretamente para a memória, permitindo o seu acesso no modo desegmentação. Os segmentos de 32 bits não utilizam o valor máximo de 4 GB,que seria muito grande. Mútiplos processos podem utilizar vários segmentosdiferentes, e na tabela de descritores de segmentos está indicado o tamanhoefetivamente usado para cada segmento. O valor de 4 GB é o limite máximo,mas podemos ter segmentos com vários valores diferentes.

Um outro mecanismo de gerenciamento de memória mais simples é apaginação. Explicando de forma simples, cada endereço físico gerado apartir do segmento e offset (chamado de endereço linear) é usado comoíndice para uma tabela de páginas. A partir desta tabela é obtido o endereçofísico na memória. Além de fazer a tradução entre endereço linear eendereço físico, o mecanismo de paginação permite proteger cada página deoutros processos, evitanto violações de memória. Permite ainda implementara memória virtual, uma área do disco rígido na qual é simulada uma grandequantidade de RAM.

Page 50: Cap08 - Arquitetura de Process Adores

8-50 Hardware Total

Figura 8.18

Paginação.

O 80386 opera com páginas de 4 kB. Todas essas páginas podem estarfisicamente localizadas na memória RAM. Entretanto é comum utilizar esterecurso para implementar a memória virtual. No Windows a memória virtualconsiste em um arquivo mantido no disco (swap file ou arquivo de troca), oWIN386.SWP, localizado em C:\Windows. A RAM é fisicamente divididaem páginas de 4 kB, assim como o arquivo de troca, entretanto este arquivotem tamanho bem maior que a memória física.

Digamos que um PC tenha 64 MB de RAM e esteja configurado com umamemória virtual de 256 MB. Usando um mecanismo de gerenciamento dememória por paginação, tanto a memória física quanto a memória virtualutilizarão páginas de 4 kB:

Memória física: 16.386 págingas de 4 kB: total = 64 MBMemória virtual: 65.536 páginas de 4 kB: total = 256 MB

Os programas podem então acessar a memória como se existissem 256 MBdisponíveis. Em um dado instante, apenas as páginas que estão mapeadas naRAM podem ser acessadas pelos programas. Quando um programa faz oacesso a um endereço de memória cuja página não está mapeada, ocorreautomaticamente uma interrupção (page fault) de software chamada“exceção restartável”. O atendimento desta interrupção é feito pelo núcleodo sistema operacional, que providencia uma página livre na RAM e copiapara a mesma o conteúdo da página correspondente da memória virtual.Quando não existe página disponível na RAM, o sistema operacional devetransferir para o arquivo de troca, alguma página da RAM que esteja há maistempo sem ser usada. Terminada a liberação da página em RAM, o sistemaoperacional providencia o retorno para a instrução que gerou a exceção.Nete retorno, a instrução que tentou acessar a memória e não conseguiu érepetida automaticamente, e desta vez poderá acessar a RAM.

Page 51: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-51

Note que a segmentação e a paginação não estão necessariamente ligadas àmemória virtual. Um PC pode estar operando com a memória virtualdesativada e ainda assim ter o acesso à RAM feito por segmentação oupaginação. Os descritores de segmento e de página oferecem métodos paranão apenas proteção de memória, mas também detectar quando uma áreanão está mapeada na RAM, permitindo o acesso à memória virtual. Emoutras palavras, quando um PC tem muita memória RAM e desativamos amemória virtual, o gerenciamento de memória do Windows continua sendofeito através da paginação.

Translation Lookaside Buffer (TLB)

O acesso à memória através de paginação requer a conversão de umendereço linear em endereço físico. A unidade de paginação precisadescobrir qual é o endereço físico de cada página de 4 kB acessada. Essesendereços são mantidos em uma tabela de páginas na memória, e a cadaacesso, o processador precisa descobrir através desta tabela, qual é oendereço físico que deve ser acessado. Isto tornaria o processador lento, poisqualquer acesso à memória precisaria de uma acesso prévio à tabela depáginas. Para resolver o problema, o 386 tem uma pequena cache internadedicada a armazenar as informações sobre páginas recentemente acessadas.Esta área é chamada de translate lookaside buffer (TLB). Este buffer é capazde armazenar a localização de 32 páginas, totalizando assim, 128 kB. Éestimado que em 98% dos acessos, o processador encontra as informações delocalização no TLB.

Modo virtual 8086

Este é um novo modo de operação introduzido no 386, compatível com omodo real e com o modo protegido simultaneamente. Não é na verdade umnovo modo de operação, pois faz parte do modo protegido. Apenas astarefas designadas a operar neste modo têm atributos específicos que alterama formação dos endereços e o modo como os registradores de segmento sãotradatos.

Programas escritos para o modo real (exemplo: MS-DOS e seus aplicativos)não funcionam no modo protegido. Basta lembrar que o sistema deendereçamento é completamente diferente. Durante o projeto do 80386, oIBM PC e o MS-DOS haviam assumido fortes posições no mercado, portantoa Intel teve a preocupação de tornar o seu novo processador compatível comeste sistema. O 80386 não apenas permite comutar entre o modo real e omodo virtual (tornando possível usar a memória estendida no ambienteDOS, bem como usar programas de modo protegido e ainda assim ter

Page 52: Cap08 - Arquitetura de Process Adores

8-52 Hardware Total

acesso às funções do DOS, que operam em modo real), mas tambémpermite que tarefas no modo protegido possam operar no modo virtual 8086.É o modo no qual é executado o Prompt do MS-DOS sob o Windows. Estemodo opera sob o modo protegido, em ambiente multitarefa, porém umatarefa neste modo tem o uso dos registradores de segmento idêntico ao do8086. Significa que registradores CS, DS, ES e SS indicam o valor dosegmento em 16 bits, são adicionados de 4 bits “0” e somados com um offsetde 16 bits. Para um programa que opera neste modo, está sendo acessadauma memória de 1 MB, porém o endereço linear gerado tem 32 bits. Atravésdo mecanismo de paginação, este 1 MB pode ser mapeado em quaisquerpáginas da memória física ou da memória virtual. Podemos assim ter váriosprogramas em modo virtual 8086 operando simultaneamente. No Windows,isto equivale a abrir várias janelas com o Prompt do MS-DOS.

Multitarefa

Um computador pode executar vários 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 seumodo protegido, todos os recursos para operar em um ambiente multitarefa.Um desses recursos é a diferenciação entre os níveis de privilégio das tarefas.As tarefas do 386 podem ter níveis 0, 1, 2 e 3. O nível 0 é o único que temacesso a todos os recursos do processador, e deve ser usado pelo núcleo dosistema operacional. Neste nível podem ser executadas as instruções paragerenciamento das demais tarefas e gerenciamento de memória. Tarefas comníveis 1 e 2 não podem executar essas instruções críticas, mas têm aceso aalgumas instruções não suportadas por programas comuns. Esses dois níveisdevem ser usados por módulos do sistema operacional e drivers. O nível 3 éo mais baixo, e pode executar praticamente todas as instruções, excetoaquelas mais críticas, só permitidas pelos níveis superiores. Programascomuns devem operar no nível 3. A figura 19 mostra como são organizadosesses níveis.

Page 53: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-53

Figura 8.19

Níveis de privilégio do 386.

Pipeline do 386

Pipeline é uma técnica 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 automóveis. Ao invés demontar um automóvel de cada vez, a montagem é dividida em várias etapasmenores. Em cada estágio é feita uma parte da montagem, e o automóvel épassado para o estágio seguinte. Todos os estágios trabalham ao mesmotempo, e no cômputo geral, a produção ao final do dia é bem elevada.

Nos processadores o trabalho também é dividido em vários estágios. Nosmodelos modernos, o número de estágios é bem elevado. No 386 existem 6estágios:

1) Unidade de interface com o barramento (Bus Interface Unit) – Faz todosos acessos à memória e ao espaço de E/S.

2) Unidade de pré-busca de código (Code Prefetch Unit) – Recebe asinstruções da unidade de interface com o barramento e as guarda em umafila de 16 bytes.

3) Unidade de decodificação de instruções (Instruction Decode Unit) –Recebe as instruções da unidade de pré-busca e as converte emmicrocódigo.

4) Unidade de execução (Execution Unit) – Executa as instruções emmicrocódigo.

5) Unidade de segmentação (Segment Unit) – Traduz o endereço lógico,formado por segmento e offset, em endereço linear de 32 bits.

Page 54: Cap08 - Arquitetura de Process Adores

8-54 Hardware Total

6) Unidade de paginação (Paging Unit) – Traduz o endereço linear emendereço físico, faz as checagens de proteção de memória. Esta unidade temuma pequena cache (TLB) com as informações sobre as 32 páginas maisrecentemente acessadas.

Essas unidades podem ser vistas na figura 14. Observe ainda que os blocosdo 386 são interligados por um barramento interno de 32 bits.

Arquitetura do 80486Explicando em poucas palavras, um processador 80486 é similar a um 80386,acrescido de um coprocessador matemático 80387, mais 8 kB de cache L1integrada. Existem entretanto outras diferenças na arquitetura interna, sendoa principal delas, o aumento do número de estágios pipeline. A figura 20mostra o diagrama interno do 486.

*** 75%Figura8.20

Diagrama interno do486.

Entre as principais diferenças em relação ao 386, notamos a cache de 8 kB,ligada à unidade de pré-busca por uma caminho de 128 bits. A fila deinstruções teve o tamanho dobrado para 32 bytes. As transferências internasde dados são agora feitas por dois caminhos de 32 bits.

Page 55: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-55

As unidades de decodificação e execução foram cada uma desmembradaem 2 estágios pipeline. São portanto ao todo 5 estágios pileline, além doestágio inicial de interface com o barramento e os dois estágios finais desegmentação e paginação. Cada um desses estágios é capaz de executar suatarefa em um único clock, portanto o 486 pode executar na maior parte dasvezes, uma instrução a cada período de clock.

Figura 8.21

Pipeline do 486.

A operação dos estágios pipeline do 486 é mostrada na figura 21. São usados5 estágios:

Prefetch Decode 1 Decode 2 Execution Writeback

Cada estágio opera em um ciclo de clock. Quando uma instrução entra nopipeline, demorará 5 ciclos para ser completada (lembre-se que existe umestágio anterior, o de interface de barramento, e dois estágios posteriores, ode segmentação e de paginação. Cada instrução leva 5 ciclos para atravessaro pipeline da figura 21, mas assim que passa do primeiro para o segundoestágio, uma segunda instrução chega ao primeiro estágio. Depois de 5clocks, o último estágio estará completando a cada clock, a execução de umainstrução. Na figura 21, os instantes t1, t2, t3 e t4 marcam a finalização dasinstruções 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 maisavançado, a principal diferença), um 486 é duas vezes mais rápido que um386 de mesmo clock.

Page 56: Cap08 - Arquitetura de Process Adores

8-56 Hardware Total

O conjunto de instruções do 486 é o mesmo do 386 e do 387 reunidos, alémde algumas instruções para controle de cache e para suporte amultiprocessamento.

Arquitetura do PentiumAlém do aumento de clock, o uso de arquitetura pipeline foi utilizada nosprocessadores 386 e 486 para aumentar o desempenho. O Pentium tambémtem suas operações de decodificação e execução realizadas por 5 estágios, talqual o 486. A grande evolução é a introdução da arquitetura superescalar,através da qual podem ser executadas duas instruções ao mesmo tempo.Podemos ver na figura 22 o diagrama do Pentium, no qual encontramos osmódulos U-Pipeline e V-Pipeline. Esses dois módulos operam de formasimultânea, e graças a eles é possível executar duas instruções ao mesmotempo. Outro melhoramento é a adoção do barramento de dados com 64bits, com a qual é possível reduzir os efeitos da lentidão da memória RAM.O Pentium tem ainda uma cache L1 maior, dividida em duas seçõesindependentes, sendo uma para código e outra para dados. A unidade deponto flutuante foi reprojetada, e é muito mais rápida que a do 486.

** 75%Figura8.22

Diagrama interno doPentium.

Page 57: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-57

Arquitetura superescalar

Uma arquitetura superescalar é aquela na qual múltiplas instruções podemser executadas simultaneamente. Podemos ver na figura 23 como ospipelines U e V do Pentium executam instruções. A execução simultânea épossível desde que se tratem de instruções independentes, ou seja, que aexecução da segunda operação não dependa do resultado da primeira.Observe que no instante t1, as instruções I1 e I2 são finalizadas, e em cadaum dos instantes seguintes, duas novas instruções são finalizadas. Destaforma o Pentium pode teoricamente executar duas instruções a cada ciclo.

Figura 8.23

Funcionamento dos estágios pipeline doPentium.

Nem sempre é possível executar instruções em paralelo. Os programas sãoformados por instruções seqüenciais ou seja, um programa é uma seqüênciade instruções. O paralelismo funciona entretanto em boa parte dos casos,pois mesmo com instruções seqüencias, muitas são independentes. Veja porexemplo o seguinte trecho de programa:

MOV SI, 1000MOV DI, 2000MOV CX,100

MOVER: MOV AL,[SI]INC SIMOV [DI],ALINC DIDEC CXJNZ MOVER

As instruções são alimentadas nas duas pipelines de forma alteranada, sendouma instrução para U e outra para V. A ordem de alimentação é mostradaabaixo.

U-Pipeline V-Pipeline

Page 58: Cap08 - Arquitetura de Process Adores

8-58 Hardware Total

MOV SI, 1000 MOV DI, 2000MOV CX,1000 MOV AL,[SI]INC SI MOV [DI],ALINC DI DEC CXJNZ MOVER MOV AL,[SI]

Note que os 3 primeiros estágios de cada pipeline são de pré-busca edecodificação, ou seja, são usados para identificar exatamente o que ainstrução deve fazer. A execução propriamente dita é feita apenas no quartoestágio, e no quinto é feito o armazenamento de valores. Se neste momento épreciso utilizar um operando que ainda está sendo calculado pela outrapipeline, a operação não pode prosseguir. Toda a fila de instruções destapipeline congelada até que o dado necessário termine de ser calculado pelaoutra pipeline e esteja disponível. Nesses instantes, apenas uma pipelinetrabalha enquanto a outra espera. Portanto em certos instantes existe aexecução paralela, mas em outros instantes o Pentium se comporta como o486, executando uma única instrução de cada vez, de acordo com adependência entre as instruções que são alimentadas em cada pipeline.

Previsão de desvio

As dependências entre instruções podem causar uma paralisação em umadas pipelines, mas assim que a dependência é resolvida, as instruçõesprosseguem ao longo da pipeline. Pior situação é quando ocorrem desvioscondicionais. Não é possível nesse caso saber que caminho tomará aseqüência de instruções antes da finalização de sua execução. Veja oexemplo:

....DEC CXJNZ LAB01

LAB00: MOV AX,1000ADD AX,DX

LAB01: MOV BX,2000....

Ao encontrar a instrução JNZ LAB01, o processador não saberá se continuaa carregar as instruções a partir de LAB00 ou de LAB01. Um processador486 simplesmente assume que o desvio não é tomado e prossegue naseqüência, ou seja, supõe que o desvio não é realizado. Se o desvioocorresse, o conteúdo de todos os estágios era decartado e a pipeline eracarregada a partir do novo endereço. Isso resultava em um período delatência de 5 ciclos, e só então o processador voltava a fornecer umainstrução por clock.

Page 59: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-59

O processador Pentium tenta “adivinhar” se um desvio vai ser executado ounão. Esta predição é feita com base no histórico das últimas vezes que ainstrução foi executada. Quando um desvio é encontrado pela primeira vez,o processador não tem dados para predizer se será executado ou não,portanto parte do princípio de que não será executado. Ao passar pelasegunda vez por este endereço, tomando como base o resultado do últimodesvio, poderá predizer com grande chance de acerto, se este desvio seráexecutado ou não. Veja o exemplo:

MOV SI,1000MOV DI, 2000MOV CX,100

LAB01: LODSBSTOSBDEC DX JNZ LAB01MOV AX,1000….

Quando o processador encontra pela primeira vez a instrução JNZ LAB01,parte do princípio de que o desvio não será realizado, e assume que apróxima instrução a ser executada é a seguinte (MOV AX,1000). Noteentretanto que estamos usando em CX um contador 100, e este desvio serárealmente executado para o endereço LAB01. Quando o processadorencontra pela segunda vez esta instrução, ele sabe a partir do seu endereço,que na vez anterior o desvio foi feito. Esta informação é armazenada em doisbits de histórico no BTB (Branch Target Buffer). Passará então a supor quedesvio será realizado, ou seja, depois de carregar a instrução JNZ LAB01,carregará as instruções a partir da LODSB. Portanto nas 98 vezes seguintesem que esta instrução for executada, o desvio será previsto de forma correta.Na centésima vez o desvio não será realizado, já que o contador chegou aofinal, e o desvio será previsto de forma errada. Neste exemplo tivemos 98%de acerto na previsão de desvio. A taxa de acerto é sempre alta quando sãofeitos desvios para o início de um loop de instruções, mas é mais baixaquando são encontrados desvios que não se repetem, ou que repetem pouco.De qualquer forma é melhor acertar algumas vezes e errar outras, que pararsempre que for encontrada uma uma instrução de desvio, como ocorria no486 e processadores mais antigos.

Cada unidade de pré-busca possui duas filas de instruções. A primeira ésempre preenchida de forma seqüencial. A segunda é usada apenas quandoé encontrado um desvio. Após a instrução JNZ do último exemplo, a filaseqüencial seria preenchida a partir da instrução MOV AX,1000 e a fila

Page 60: Cap08 - Arquitetura de Process Adores

8-60 Hardware Total

alternativa seria preenchida a partir da instrução LODSB. O processadorpassa a preencher a fila alternativa e paralisa a outra quando prediz que odesvio será tomado, e deixa a fila alternativa paralisada e opera com aprincipal quando prediz que o desvio não será tomado. O Pentium nãocarrega portanto as instruções das duas ramificações, e sim, escolhe a maisprovável (tomando como base o histórico das últimas execuções dainstrução) e passa a carregar instruções a partir deste ponto.

O mecanismo de previsão de desvio é realmente um pouco complexo e nemsempre acerta, mas em caso de erro na previsão, não prejudica oprocessador. Ele evita que o processador pare sempre que encontra umainstrução de desvio, e qualquer acerto é lucro. Note ainda que os resultadossó são efetivados depois que a previsão é confirmada, portanto uma previsãoerrada não causa resultados errados, apenas necessita de mais 5 ciclos emmédia para que os estágios pipeline voltem a operar com máxima eficiência.

Instrução CPUID

A partir do Pentium, os processadores Intel (o mesmo ocorre comprocessadores de outros fabricantes) passaram a incluir no seu conjunto deinstruções, uma que fornece infromações que identificam o processador. É ainstrução CPUID (CPU Identification). Programas de diagnóstico eprogramas que dão informações sobre a configuração de hardware utilizamesta instrução para informar corretamente o modelo do processador, bemcomo identificar suas características.

Microarquitetura P6Esta arquitetura foi usada a partir de 1995, com o lançamento do PentiumPro, e sofreu algumas modificações posteriores, dando origem ao Pentium II,Celeron e Pentium III, bem como suas versões Xeon.

Uma das principais características desta nova arquitetura é a introdução deum “velho” conceito já usado há alguns anos em computadores maispoderosos: a tecnologia RISC – Reduced Instruction Set Computer.

CISC e RISC

Os processadores Intel, até o Pentium inclusive, são considerados máquinasCISC (Complex Instruction Set Computer). Significa que seu conjunto deinstruções é bastante complexo, ou seja, tem muitas instruções que sãousadas com pouca freqüência. Um programador de linguagem Assembly usacom muita freqüência instruções MOV, CALL, RET, JMP, ADD e outras,mas raramente usa instruções como XLAT e todas as opções de shifts e

Page 61: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-61

rotates A instrução XLAT, por exemplo, poderia ser substituída pelaseqüência ADD BX,AX / MOV AL,[BX]. Teoricamente o uso de uma únicainstrução teria uma execução mais rápida que se fossem usadas duas ou maisinstruções, mas na prática não é o que ocorre. Um processador com umconjunto de instruções muito complexo perde muito tempo para decodificaruma instrução. Além disso, um maior número de circuitos internos serianecessário para a implementação de todas essas instruções. Muitos dessescircuitos são pouco utilizados a acabam apenas ocupando espaço econsumindo energia. Maior número de transistores resulta em maioraquecimento, o que impõe uma limitação no clock máximo que oprocessador pode utilizar.

Por outro lado, a arquitetura RISC (Reduced Instruction Set Computer –computador com conjunto de instruções reduzido) utiliza instruções maissimples, porém resulta em várias vantagens. Instruções simples podem serexecutadas em um menor número de ciclos. Com menos instruções, adecodificação de instruções é mais rápida e os circuitos do decodificadorpassam a ocupar menos espaço. Com menos circuitos, torna-se menor oaquecimento, e clocks mais elevados podem ser usados. Todas essasvantagens compensam o fato de um processador RISC não ter instruções“poderosas” como XLAT, por exemplo. Colocando tudo na balança, umprocessador RISC consegue ser mais veloz que um CISC de mesmatecnologia de fabricação.

Existe um caso clássico em um processador CISC usado em um computadorde grande porte produzido pela Digital (VAX 8600) nos anos 80. Ele tinhauma instrução BOUND, usada para checar se um índice está dentro doslimites permitidos por um array (a instrução BOUND do 80826 faz umtrabalho similar). Se fossem usadas instruções mais simples de comparaçãodo próprio processador do VAX 8600, a execução seria mais rápida quecom o uso da sua própria instrução BOUND. Isso dá uma idéia de comoinstruções complexas tendem a reduzir a eficiência do computador. A únicavantagem aparente das instruções complexas é a economia de memória.Entretanto isso já deixou de ser vantagem há muitos anos, devido à queda depreços das memórias.

Há muitos anos se fala em abandonar completamente o velho conjunto deinstruções CISC da família x86 e adotar uma nova arquitetura, com umconjunto de instruções novo. Isto traria entretanto um grande problema, queé a incompatibilidade com os softwares já existentes, mas um dia será feitaesta transição (é o que a Intel espera fazer com a chegada do processadorItanium). Enquanto isso, os fabricantes de processadores adotaram um novo

Page 62: Cap08 - Arquitetura de Process Adores

8-62 Hardware Total

método de construção dos seus chips. Utilizam internamente um núcleoRISC, mas externamente comportam-se como máquinas CISC. Essesprocessadores aceitam as instruções x86 e as convertem para instruções RISCno seu interior para que sejam executadas pelo seu núcleo. Este processomostrou-se mais eficiente que tentar produzir novos processadores CISC. OPentium MMX foi o último processador totalmente CISC. Todos os novosprocessadores utilizam um núcleo RISC e tradutores internos de CISC paraRISC.

Execução dinâmica

Processadores de microarquitetura P6 utilizam um mecanismo de execuçãofora de ordem que a Intel chama de Dynamic Execution. A execução forade ordem é um recurso necessário para o paralelismo no processamento deinstruções. A execução dinâmica utiliza por sua vez, três técnicas:

Previsão de desvio Análise dinâmica do fluxo de dados Execução especulativa

A previsão de desvio consiste em manter as unidades de busca edecodificação buscando instruções a partir de um desvio condicional, aoinvés de simplesmente parar até que o desvio seja processado. Técnicas deprevisão de desvio mais avançadas fazem com que a taxa de acerto nasprevisões seja mais alta que nos processadores anteriores. Na previsão dedesvio, não é feito o carregamento das duas ramificações de um desviocondicional, e sim, é escolhido um caminho mais provável e este passa a sercarregado para execução.

A análise dinâmica do fluxo de dados consiste em monitorar as instruçõesem andamento e determinar quais delas podem ser executadas antes deoutras sem prejudicar a intergridade dos dados. Nos processadores Pentium,a checagem de dependências era feita apenas entre as instruções queestavam sendo executadas nas pipelines U e V. Nos processadores demicroarquitetura P6, um número maior de instruções pode ser monitorado,sendo determinada uma ordem de execução que tende a aproveitar melhoras unidades de execução.

Execução especulativa

A execução especulativa é uma das três técnicas usadas na execuçãodinâmica, e sem dúvida é uma grande inovação, por isso preferimos explicá-la separadamente. Processadores de arquitetura P6 buscam constantemente

Page 63: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-63

instruções na memória, fazem sua decodificação e as colocam em um poolde instruções (figura 24). Podemos visualizar este pool como uma espécie de“tanque” com instruções a serem executadas. As unidades de execuçãotrabalham constantemente executando as instruções deste pool que nãopossuem dependências em relação a outras instruções. A ordem na qualessas instruções são executadas não é necessariamente a mesma ordem naqual elas se encontram nos programas. Uma unidade de retirada éencarregada de finalizar as instruções, o que consiste em armazenar valoresfinais na memória e nos registradores. Esta unidade de retirada éencarregada de restabelecer a ordem original das instruções, conforme seencontram nos programas.

Figura 8.24

Modelo simplificado de um processadorde microarquitetura P6.

Observe ainda na figura 24 que todo o acesso à memória é feito porintermédio das caches. A unidade de busca e decodificação obtéminstruções da cache L1. Se a instrução a ser buscada não está na cache L1, éfeita automaticamente a busca na cache L2. Se a instrução não está na cacheL2, automaticamente será feita a busca na memória externa. O mesmoocorre na leitura e escrita de dados , sempre feitas a partir da seção de dadosda cache L1. A separação da cache L1 em seções de código e de dadosserve para não interromper o fluxo de instruções sendo buscadas quando épreciso acessar dados.

O processadores Pentium nunca executavam antecipadamente instruçõesposteriores a um desvio. Eles apenas “chutavam” qual dos ramos de umdesvio seria tomado e adiantavam a execução do ramo escolhido. Seocorresse um erro nesta previsão, o conteúdo da pipeline era simplesmente

Page 64: Cap08 - Arquitetura de Process Adores

8-64 Hardware Total

descartado. Na microarquitetura P6, as instruções são executadas fora deordem. Desta forma uma instrução posterior a um desvio poderia serexecutada antes do desvio ser processado. Se a previsão de desvio fosseerrada, teríamos uma instrução sendo processada indevidamente. Esteproblema é resolvido pela unidade de retirada de instruções. Ela somenteretira as instruções que foram efetivamente executadas. Aquelas que foramexecutadas antecipadamente e indevidamente são descartadas. Para evitarque uma instrução descartada altere um registrador ou endereço de memóriaindevidamente, a atualização dos registradores e da memória só é feita pelaunidade de retirada de instruções. Suponha por exemplo a seguinteseqüência:

MOV AX,2000DEC BXJZ LAB01MOV AX,1000INC CX

LAB01: …

Como as instruções são executadas fora de ordem, as instruções MOVAX,1000 e INC CX podem ser executadas antes da instrução JZ LAB01 serprocessada, caso a previsão de desvio tenha “chutado” que o desvio dainstrução JZ LAB01 não iria ser realizado. Entretanto se o desvio forrealizado, as instruções MOV AX,1000 e INC CX não deveriam ter sidoexecutadas. Por isso as unidades de execução não atualizam efetivamente osregistradores e a memória, e sim indicam que dados deverão serarmazenados caso as instruções sejam realmente executadas.

Micro-ops

O núcleo dos processadores de arquitetura P6 é RISC. Sua unidade debusca e decodificação converte as instruções CISC (x86) obtidas da memóriaem instruções RISC. A Intel prefere chamar essas instruções RISC de micro-ops.

Page 65: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-65

Figura 8.25

Diagrama interno deprocessadores P6.

Diagrama interno do processador

Na figura 25 vemos o diagrama interno de processadores de microarquiteturaP6. A unidade de busca de instruções (Instruction Fetch Unit) obtéminstruções CISC x86 da cache L1 de código e as envia para o decodificadorde instruções. Este decodificador faz a conversão dessas instruções paramicro-ops, ou seja, instruções RISC. Essas instruções são então enviadas aoinstrucion pool, onde são executadas fora de ordem. Note portanto que asinstruções encontradas no instruction pool não são instruções CISC, e sim,micro-ops (RISC). A partir do decodificador de instruções, o processador étotalmente RISC. A unidade de execução tem 5 estágios paralelos,permitindo a execução de até 5 micro-ops por período de clock.

No diagrama da figura 25 vemos outros blocos importantes:

Branch Target Buffer – É um conjunto de ponteiros com endereços dasinstruções resultantes de desvios. Seu uso é importante na previsão dedesvio.

Microcode Instruction Sequencer – Operações CISC simples são traduzidasdiretamente em uma única micro-op. Operações mais complexas podem sertraduzidas em várias micro-ops. Ao invés de usar um decodificadorcomplexo capaz de converter todas as instruções, aquelas mais complexas e

Page 66: Cap08 - Arquitetura de Process Adores

8-66 Hardware Total

menos usadas são convertidas através de uma tabela encontrada nestemódulo. O Microcode Instruction Sequencer é portanto uma ROMcontendo micro-ops equivalentes às instruções CISC x86 mais complexas.

Memory Reorder Buffer – Este módulo recebe uma seqüência de operaçõesde leitura e escrita na memória e rearruma essas operações de forma maiseficiente. Faz por exemplo com que as leituras sejam efetivadas antes dasescritas, evitando assim que o processador tenha que esperar muito por umdado da memória.

Registre File – É o conjunto de registradores da arquitetura Intel: EAX,EBX, ECX, etc.

Adições na arquitetura P6

O Pentium Pro foi o primeiro processador a utilizar esta arquitetura. Com oPentium II, algumas alterações importantes foram feitas, como a adição deinstruções MMX, maior eficiência na execução de programas de 16 bits ealterações estratégicas na cache L2. Como sabemos, o Pentium Pro tinha 256kB de cache L2 integrada, e o Pentium II, assim como as primeiras versõesdo Pentium III, usavam uma cache L2 separada do núcleo, formada porchips SRAM, com 512 kB e operando com a metade da freqüência donúcleo.

O Pentium III recebeu novas instruções chamadas SSE. São novas instruçõesMMX e para processamento de gráficos em 3D. Posteriormente o PentiumIII teve a sua cache L2 integrada ao núcleo. Esta cache passou também a ter256 kB e opera com a mesma freqüência do núcleo. Finalmente o PentiumIII Tualatin teve esta cache aumentada para 512 kB.

Arquitetura do Pentium 4O Pentium 4 e o Intel Xeon são os primeiros processadores a utilizarem anova arquitetura Netburst da Intel. Apesar de ter muitos pontos em comumcom a arquitetura P6, a Netburst é um projeto totalmente novo.

Page 67: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-67

Figura 8.26

Diagrama interno do Pentium4.

Um ponto notável desta arquitetura é a nova cache L1, chamada deExecution Trace Cache. As caches L1 de processadores anterioresarmazenam instruções x86 (IA-32). As unidades de pré-busca e decodificaçãolidam com instruções provenientes da cache L1 e as introduzem naspipelines ou no pool de instruções para que sejam executadas. Nosprocessadores de arquitetura P6, as instruções provenientes dosdecodificadores são micro-ops (instruções RISC). Nas máquinas Netburstcomo o Pentium 4, as unidades de pré-busca e decodificação obtém asinstruções diretamente da cache L2, e não da cache L1. Instruções jádecodificadas e convertidas em micro-ops são transferidas para a cache L1,de onde as unidades de execução obtém as micro-ops a serem executadas. Avantagem de operar desta forma é que nos programas sempre temosinstruções que são executadas repetidas vezes. Não é necessário decodificarnovamente instruções que foram executadas há pouco tempo, pois sua formajá convertida em micro-ops ainda estará na cache L1. Portanto o trabalho dedecodificação é feito uma só vez, e é aproveitado novamente quando umamesma instrução é executada outras vezes.

Existe um certo mistério da Intel em relação ao tamanho da cache L1.Apenas é divulgado que esta cache armazena 12k micro-ops, mas não o seutamanho em kB. Isto gera uma certa confusão, inclusive este autor jádivulgou erradamente como 12 kB, o tamanho da cache L1 do Pentium 4, oque não está correto. São na verdade 12k micro-ops. Por outro lado, a Intelnão divulga oficialmente o tamanho de uma micro-op nas máquinasNetburst. Apenas é divulgado que a eficiência desta cache de 12k micro-opsé similar à de uma cache comum com tamanho entre 8 kB e 16 kB. Ou seja,em termos de eficiência da cache L1, é similar à de um Pentium III e outras

Page 68: Cap08 - Arquitetura de Process Adores

8-68 Hardware Total

máquinas P6. Já a cache L1 de dados opera de forma similar à das caches L1de outras arquiteturas. Seu tamanho é 8 kB.

Máquinas Netburst têm um pool de instruções capaz de manter 126instruções em andamento. Nas máquinas P6 eram apenas 40 instruções. Istopermite executar um número maior de instruções antecipadas, ou seja, forade ordem. A unidade de execução pode executar até 6 instruções por ciclode clock, resultando em alto grau de paralelismo.

Máquinas Netburst são classificadas como hyperpipelined. operando compipeline de 20 estágios (máquinas P6 operavam com 10 estágios). Usarestágios menores significa que cada um dos estágios pode ser mais simples,com um menor número de portas lógicas. Com menos portas lógicas ligadasem série, é menor o retardo de propagação entre essas portas, e desta formao ciclo de operação pode ser menor, ou seja, a freqüência de operação podeser maior. Máquinas Netburst podem portanto operar com maioresfreqüências de operação que as máquinas P6 de mesma tecnologia. Usando amesma tecnologia de produção do Pentium III (0,18), o Pentium 4 é capazde atingir clocks duas vezes maiores.

De 32 para 64 bitsOs processadores usados em praticamente todos os PCs modernos utilizam aarquitetura x86, também chamada de IA-32. O termo x86 é devido à origemdos processadores usados no PC, começando com o a família 8086/8088.Processadores 8086, 8088, 80186, 80188 e 80286 eram todos de 16 bits.Significa que a maioria das suas instruções operavam com valores inteiros deaté 16 bits, e que praticamente todos os seus registradores internos tinham 16bits.

O termo IA-32 é mais novo, e significa Arquitetura Intel de 32 bits. Éderivada do processador 80386. Todos os processadores usados nos PCsmodernos são derivados desta arquitetura. Em outras palavras, podemosconsiderar o Pentium 4 e o Athlon como versões super velozes do 386,acrescidos de alguns recursos, porém são todos baseados em conjuntos deinstruções compatíveis com o do 386. Os termos x86 e IA-32 são usadoscomo sinônimos, sendo que a AMD prefere usar o termo x86, enquanto aIntel prefere usar IA-32.

Tanto a Intel como a AMD estão entrando na era dos 64 bits, cada uma comsua própria arquitetura:

Page 69: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-69

Intel: IA-64AMD: AMD x86-64

Essas duas arquiteturas têm características distintas. Ambas são de 64 bits, ouseja, utilizam registradores, valores e endereços de 64 bits, apesar depoderem também manipular valores de 32, 16 e 8 bits.

Intel IA-64

A arquitetura IA-64 é incompatível com a IA-32. Isto significa que osprogramas que usamos nos PCs atuais não funcionarão nos PCs baseados naarquitetura IA-64. Para facilitar a transição entre as arquiteturas IA-32 e IA-64, o processador Intel Itanium (o primeiro a ser produzido com a IA-64)utiliza um tradutor interno de instruções IA-32 para IA-64. Desta formapoderá utilizar os programas atuais, porém com desempenho reduzido.

A idéia não é comprar PCs com o Itanium para executar os programasatuais, e sim, utilizar os novos programas IA-64. Porém enquanto nãoestiverem disponíveis todos os programas na versão de 64 bits, poderão serusadas versões antigas (ou seja, atuais) de 32 bits. Inicialmente a arquiteturaIA-64 é voltada para servidores e workstations de alto desempenho para usoem CAD, processamento científico e outras aplicações que exigem grandequantidade de cálculos.

Para os PCs “normais”, a Intel continuará fornecendo processadores IA-32,como o Pentium 4 e seus sucessores. Desta forma foi aberto um leque deopções: novos processadores de 32 bits e novos processadores de 64 bits,porém compatíveis com os de 32 bits.

AMD x86-64

A AMD também lançará processadores de 64 bits, entretanto foi adotadauma arquitetura diferente, chamada AMD x86-64. Entendendo de formabem simples, esta arquitetura engloba a atual IA-32 (ou x86, de 32 bits) eadiciona recursos de 64 bits. Desta forma os programas poderão operar comvalores de 64, 32, 16 e 8 bits. Os atuais programas de 32 bits funcionarãoperfeitamente nesta nova plataforma. Internamente os processadorespossuirão os mesmos registradores internos encontrados nas máquinas x86,porém ampliados para 64 bits. É uma evolução parecida com a transição de16 para 32 bits, a partir do 80386. No 386, todos os registradores e instruçõesde 16 bits foram mantidos, e ainda ampliados para 32 bits.

Page 70: Cap08 - Arquitetura de Process Adores

8-70 Hardware Total

Os programas atuais para 32 bits continuarão funcionando normalmente,com seu pleno desempenho, ao contrário do que ocorre na arquitetura IA-64, que é incompatível com a IA-32. Temos aqui um pequeno problema: osfuturos programas de 64 bits para a plataforma IA-64 serão incompatíveiscom os programas de 64 bits para a arquitetura x86-64. Os fabricantes desoftware terão que desenvolver seus programas nas duas versões, e quandonão o fizerem, o usuário terá que usar apenas os programas específicos parasua arquitetura, Intel ou AMD.

Os primeiros processadores AMD de 64 bits possuem os nomes provisóriosde “ClawHammer e SledgeHammer”. Ambos serão processadores de 8a

geração, 64 bits e tecnologia de 0,13, com lançamento previsto para 2002.O ClawHammer irá operar em sistemas para até 2 processadores, e oSledgeHammer irá operar com sistemas para 4 e 8 processadores.

32 bits para vários anos

A chegada dos processadores de 64 bits não vai sepultar de uma ora paraoutra a tecnologia de 32 bits. Podemos comparar com o que ocorreu natransição de 16 para 32 bits. O 80386 foi lançado em 1985, mas o 286, de 16bits, continuou sendo o processador mais usado até o início dos anos 90,sendo finalizada a sua produção em 1993. A partir daí os PCs têm usadoapenas arquiteturas de 32 bits, desde o 386 até o Pentium 4 e o Athlon.

A transição de 32 para 64 bits não será diferente. Novos processadores de 32bits continuarão sendo lançados e bastante utilizados em todos os PCs. Osmodelos de 64 bits começarão a ser usados nos PCs de alto desempenho,como servidores e wortkstations, para depois de alguns anos entrar nomercado de PCs comuns. Tanto é assim que o Pentium 4, lançado em 2000,é inteiramente de 32 bits, e ganhará novas versões nos próximos anos. Aarquitetura de 64 bits da AMD, por sua vez, não abandona a atual de 32 bits,portanto os programas atuais poderão continuar sendo usados por muitosanos. Assim como hoje um Pentium 4 é capaz de executar programas de 16bits, os processadores de 64 bits da AMD continuarão operando tambémcom 32 bits.

Processador Intel ItaniumA figura 27 mostra um processador Intel Itanium, o primeiro baseado naarquitetura IA-64. No início do seu desenvolvimento era conhecido pelo seunome-código, Merced. É produzido na forma de um cartucho chamadoPAC418, o mesmo nome do soquete usado nas placas de CPU para esteprocessador. No interior do cartucho encontramos o processador

Page 71: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-71

propriamente dito e os chips SRAM que formam a cache L3. As primeirasversões do Itanium têm 2 MB ou 4 MB de cache L3. As caches L1 e L2 sãointegradas ao núcleo do processador, e as placas de CPU ainda poderão usaruma cache L4 opcional. O Itanium possui 15 unidades de execução e 256registradores internos de 64 bits, sendo 128 para números inteiros e 128 paranúmeros de ponto flutuante.

Figura 8.27

Processador Intel Itanium.

Além da cache L3, o Itanium possui uma cache L1 com 32 kB (16 kB paracódigo e 16 kB para dados) e cache L2 com 96 kB. Parece um tamanhopequeno para uma cache L2, mas note que se compararmos com outrosprocessadores, é a cache L3 de 2 MB ou 4 MB do Itanium que faz o trabalhoque em outros processadores é feito pela cache L2, com 256 kB ou 512 kB.Ainda baseado na tecnologia de 0,18, resultando na alta dissipação de calorpelos seus 25 milhões de transistores do seu núcleo (sem contar os quase 300milhões da cache L3), o Itanium terá sucessores baseados na nova tecnologiade 0,13.

A figura 28 mostra em detalhes a vista superior do cartucho do Itanium.Possui na sua parte lateral um conector exclusivo para alimentação. Existemfuros para a fixação do cooler e para fixar o cartucho na placa de CPU.

Page 72: Cap08 - Arquitetura de Process Adores

8-72 Hardware Total

Figura 8.28

Cartucho PAC418, vista superior.

A figura 29 mostra a parte inferior do cartucho. Clipes laterais fazem aretenção do processador, ajudando a fixação no soquete. Como jámostramos, o conector de alimentação fica na parte lateral do cartucho. Nasua parte inferior ficam os contatos do processador propriamente dito.

Figura 8.29

Cartucho PAC418, vista inferior.

Clock interno e externo

As primeiras versões do Itanium operam com 733 e 800 MHz de clockinterno. Parecem valores baixos em comparação com o Pentium 4, que jáultrapasssou a barreira dos 2 GHz. Note entretanto que tudo no interior doItanium ocorre com 64 bits, portanto tem condições de apresentar umrendimento no mínimo duas vezes maior em comparação com o Pentium 4.Além disso o Itanium oferece um grau de paralelismo muito superior ao doPentium 4. Não podemos comparar processadores de arquiteturas diferenteslevando em conta apenas o clock.

Page 73: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-73

O clock externo das primeiras versões do Itanium é de 133 MHz com DDR,produzindo resultados equivalentes ao de um clock de 266 MHz. Seubarramento de dados tem 64 bits, portanto a taxa de transferência máximateórica é de 2133 MB/s.

Modelo Clock externo Clock interno MultiplicadorItanium/733 133 MHz 733 MHz 5,5xItanium/800 133 MHz 800 MHz 6x

OBS: Esses são os modelos previstos ao final de 2001, antes do lançamento do Itanium. A Intelatrasou o seu lançamento e trabalhava na nova versão do Itanium, o McKinley, com clocksmais elevados.

Voltagens e consumo elétrico

Assim como ocorre com outros processadores modernos, o Itanium informaas voltagens de que necessita. São informadas voltagens diferentes para oprocessador e para a cache L3, através de pinos identificadores. A voltagemdo núcleo, nas primeiras versões do Itanium, obedecia à especificação dafigura 30. São suportados valores entre 1,250 e 1,600 volt, em intervalos de0,025 volt.

Figura 8.30

Identificação da voltagem do núcleo doItanium.

Já a voltagem usada pelos chips da cache L3 do Itanium seguem umaespecificação que pode variar entre 1,650 a 2,100 volts, em intervalos de0,050 volt, como vemos na figura 31.

Page 74: Cap08 - Arquitetura de Process Adores

8-74 Hardware Total

Figura 8.31

Identificação da voltagem para os chipsda cache L3 do Itanium.

O Itanium é um processador bastante quente. Os modelos de 733 e 800MHz têm 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 produção de modelos com clocks mais elevados,mas a situação irá melhorar depois da adoção da tecnologia de 0,13.

Barramentos de dados e endereços

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 com64 bits, portanto apresenta uma taxa de transferência máxima teórica de2133 MB/s. Até 4 processadores podem ser ligados em conjunto na mesmaplaca.

Seu barramento de endereços tem 44 bits, permitindo acessar diretamenteuma memória física de até 16 Terabytes (17.592.186.044.416 bytes). Aoacessar memória virtual, opera com endereços de 54 bits, podendoendereçar até 16 Petabytes (18.014.398.509.481.984 bytes).

Futuros processadores Intel de 64 bitsAinda são bastante escassas as informações sobre os processadores IA-64posteriores ao Itanium. A própria Intel não divulga publicamente taisinformações, exceto em conferências. Estão previstos novos processadoresque por enquanto têm nomes códigos de McKinley, Madison e Deerfield.

O McKinley (possivelmente será chamado de Itanium II) deverá usar atecnologia de 0,13 e sua cache L3 será integrada ao núcleo. Irá operar comclocks superiores a 1000 MHz. O Madison terá uma cache L3 maior(possivelmente 8 MB) e um barramento externo mais veloz. O Deerfielddeverá ser uma versão de baixo custo do Madison, com cache L3 de apenas1 MB, voltado para o mercado de PCs de baixo custo. Será uma espécie de“Celeron de Itanium”.

Page 75: Cap08 - Arquitetura de Process Adores

Capítulo 8 – Arquitetura de processadores 8-75

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