Saltar para o conteúdo

x86

Origem: Wikipédia, a enciclopédia livre.
O Intel 8086.
Intel Core 2 Duo - Um exemplo de aquitetura x86 compativel com processadores multicore de 64-bit.
AMD Athlon (primeira versão) - outra implementação x86 tecnicamente diferentes, mas totalmente compatível.

Em informática, x86 ou 80x86 é o nome genérico dada à família (arquitetura) de processadores baseados no Intel 8086, da Intel Corporation.[1][2]

A arquitetura é chamada x86 porque os primeiros processadores desta família eram identificados somente por números terminados com a sequência "86": o 8086, o 80186, o 80286, o 80386 e o 80486. Como não se pode ter uma marca registrada sobre números, a Intel e a maior parte de seus competidores começaram a usar nomes que pudessem ser registrados como marca, como Pentium para as gerações de processadores posteriores, mas a antiga nomenclatura tinha forjado um termo para toda a família.

O termo x86 não é sinônimo de compatibilidade com IBM PC, pois isso sugere uma infinidade de outros hardwares e sistemas embarcados bem como computadores usando chips x86 antes do moderno mercado ser compatível com PC, alguns deles antes mesmo do IBM PC em si.

Houve várias tentativas, dentro da Intel em si, para quebrar o domínio do mercado da arquitetura x86, que descendia diretamente do simples microprocessadores de 8 bits. Exemplos disso são as iAPX 432 (aliás Intel 8800), o Intel 960, Intel 860 e Intel e a arquitetura do Hewlett Packard Itanium. No entanto, o aperfeiçoamento contínuo de 86 micro arquiteturas, circuitos, e fabricação de semicondutores provaria que é difícil substituir x86 em vários segmentos. O 64, da extensão bit da AMD x86 (que a Intel finalmente respondeu, com um design compatível) e a escala de processadores x86, como o eight-core Intel Xeon e 12-core AMD Opteron destaca-se o x86 como um exemplo de contínuo aperfeiçoamento e como as normas estabelecidas pela indústria pode resistir à concorrência das novas arquiteturas.

A tabela abaixo mostra as marcas de processadores e microprocessadores na Hall da Fama, agrupados por gerações que destacam pontos importantes na história do x86. Nota: As gerações de CPU não são rígidas, cada geração é marcada por melhoras significativas ou comercialmente bem sucedidos projetos do processador.

Geração Introduzido inicialmente em Marcas e Modelos de CPU Linear / Espaço de endereço físico Novos recursos
1 1978 Intel 8086, Intel 8088 16-bit / 20-bit (segmentados) Primeiros processadores X86.
2 1982 Intel 80186, Intel 80188, NEC V20/V30 Hardware para cálculos de endereços rápidos.
Intel 80286 16-bit (30-bit virtual) / 24-bit (segmentados) MMU, para o modo protegido e um maior espaço de endereço.
3 (IA-32) 1985 Intel 80386
AMD Am386
32-bit (46-bit virtual) / Conjunto de instruções com 32-bit, MMU com paginação.
4 1989 Intel 486 (SX/DS/DX2)
AMD Am486 (SX/SX2/DX/DX2/DX4)
AMD 5x86 (486 DX5)
Cyrix 486 (SX/DX/DX2/DX4)
Cyrix 5x86 (486DX3 e DX5)
RISC FPU pipelining, cache integrada, on-chip.
5 1993 Intel Pentium Superscalar, 64-bit databus, faster FPU, MMX.
1994 NexGen Nx586 Inicialmente não possuía FPU, foi adicionada em modelos posteriores.
6 1995 Pentium Pro Execução Expeculativa, foi substituído pelo Pentium Xeon.
5 1996 AMD K5, Cyrix 6x86, Rise mP6 como acima / 36-bit Físico (PAE) translação μ-op, PAE Pentium Pro, integrado com cache L2 (Pentium Pro), instrução de movimentação condicional.
6 1997 AMD K6/-2/3, Pentium II/III, IDT/Centaur-C6 cache L3 suportando, 3DNow, SSE.
7 1999 Athlon, Athlon XP superscalar FPU, design wide (até três instruções por ciclo de clock)
2000 Pentium 4 Alta conduta, alta frequencia, SSE2, hyper-threading.
6-M/7-M 2003 Pentium M, VIA C7 (2005), Intel Core (2006) Otimizados para baixo consumo.
8 (x86-64) Athlon 64, Opteron 64-bit / 40-bit Implementação física do primeiro processador AMD. Conjunto de instruções x86-64, controlador de memória on-die, hypertransport.
2004 Pentium 4 Prescott Alta contuta, Altíssima frequencia, SSE], capacidade de 64 bits está disponível somente em soquetes LGA 775.
9 2006 Intel Core 2 baixo consumo, multi-core, menor frequencia de clock, SSE4 (Penryn)
10 2007 AMD Phenom como acima / 48-bit processador físico AMD Phenom monolítica quad-core, 128 FPUs bit, SSE4a, HyperTransport 3 ou QuickPath, controlador de memória nativa, on-die cache L3, design modular.
2008 Intel Core i3, Intel Core i5, Intel Core i7
Intel Atom Altamente canalisado porém com sua potência muito baixa.
VIA Nano Fora de ordem, superescalar, criptografia baseada em hardware, muito baixa energia, gerenciamento de energia adaptativa.
11 2010 Intel Sandy Bridge, AMD Bulldozer SSE5/AVX, design altamente modular.

A arquitetura x86 aparece primeiro como o Intel 8086 CPU lançado em 1978, um projeto totalmente de 16 bits baseado na anterior de 8 bits com base 8008, 8080 e 8085. Apesar de não ser compatíveis com o binário, ele foi projetado para permitir que programas escritos em linguagem assembly serem mecanicamente traduzidos para o conjunto 8086 equivalente. Isso fez com que o novo processador fosse um caminho de migração tentador, mas não sem uma remodelagem de hardware significativa, principalmente devido ao barramento de dados 16-bit externo. Para resolver isso, a Intel lançou o 8088 quase idêntico, com um barramento de dados externo de 8-bit, o que permitiu o uso de placas de circuito mais simples e exigiu poucas fichas (1-bit de largura) DRAM. O 8088 também pode ser conectado ao já estabelecido (ou seja, de baixo custo) de 8 bits do sistema e chips periféricos mais facilmente. Entre outros fatores não técnicos, o que contribuiu para o fato de que a IBM construisse seu IBM PC usando o 8088, apesar da presença de microprocessadores de 16 bits da Motorola, Zilog, e National Semiconductor. O IBM PC, posteriormente assumiu Z80-based CP/M systems, Apple II, e outros computadores populares, e tornou-se um padrão de fato dominante, para computadores pessoais, permitindo assim que os 8088 e os seus sucessores dominassem este ramo importante de microprocessadores no mercado.

iAPX 432 e a 80286

[editar | editar código-fonte]

Outro fator foi que o Intel 8800 (aliás iAPX 432) não compatível com 32 bits, falhou no mercado na época que o IBM-PC foi lançado. O novo e rápido 80286 realmente contribuiu para a decepção do semi-contemporâneo 8800 no início de 1982. (O 80186, lançado em paralelo com o 80286, foi concebido para sistemas embarcados, e, portanto, teve um grande mercado de qualquer maneira.) A falha de mercado dos 32 bits 8800, foi um impulso significativo para a Intel continuar desenvolvendo 8086 compativéis mais avançados, como o 80386 (uma extensão de 32 bits do 80286 com bom desempenho).

Outros fabricantes

[editar | editar código-fonte]

Por várias vezes, empresas como IBM, NEC, AMD, TI, STM, Fujitsu, OKI, Siemens, Cyrix, Intersil, C & T, NexGen, e a UMC começaram a fabricação de processadores x86 destinado a computadores pessoais e de sistemas embarcados. Tais implementações x86 raramente são cópias simples, e muitas vezes empregam diferentes microarquiteturas internas, bem como diferentes soluções ao nível eletrônico e físico. Muito naturalmente, os primeiros chips compatíveis foram de 16 bits, enquanto os projetos de 32 bits apareceram mais tarde. Para o mercado de computadores pessoais, a quantidade real começou a aparecer por volta de 1990 com o i386 e o i486, processadores compatíveis, então nomeados similarmente como Chip Original Intel. Outras empresas, que projetaram ou fabricaram processadores x86 ou x87, foram a ITT Corporation, a National Semiconductor, a ULSI System Technology, e a Weitek.

Após a pipelined i486, a Intel lançou a marca Pentium para sua nova linha de modelos x86 superescalar. Com o esquema de nomeação de 86 agora legalmente seguro, a Intel fez uma parceria com a IBM para produzir o Cyrix 5x86 e 6x86. Nessa época a AMD, estava projetando e fabricando o 5k86, que internamente, foi baseado no design da AMD RISC 29K, semelhante ao Nx586 NexGen. A AMD usou uma estratégia em que estágios da pipeline, decodificavam instruções x86 e outros manuseios de micro Operações, um método muito usado como base para o design do x86, da época.

Algumas versões mais antigas desses chips tiveram problemas de dissipação do calor. O 6x86 também foi afetado por alguns pequenos problemas de compatibilidade, o Nx586 faltava uma unidade de ponto flutuante (FPU) e a compatibilidade de pinos, enquanto o K5 tinha um desempenho um pouco decepcionante, quando foi lançado. A conscientização do cliente para a linha Pentium contribuíu para estes projetos sendo comparativamente melhor, apesar do fato de que o K5 tinha boa compatibilidade com Pentium e 6x86. A AMD conseguiu, mais tarde, estabelecer-se como um grande concorrente com a linha de processadores K6, que deu lugar ao grande sucesso Athlon e Opteron. Houve também outros concorrentes, como a Centaur Technology (formerly IDT), a Rise Technology, e a Transmeta. Processadores como o VIA Technologies C3 e C7, que foram projetados pela Centaur, também foram vendidos por muitos anos. O mais novo projeto da Centaur, o VIA Nano, é o primeiro processador com a execução superescalar. Foi interessante, pois foi introduzido na mesma época do processador Intel's first "in-order" desde o P5 Pentium, o Intel Atom.

Extensões do tamanho de bits

[editar | editar código-fonte]

A arquitetura do conjunto de instruções foi prorrogado duas vezes para um tamanho maior. Em 1985, a Intel lançou o 32 bits 80386 (ou i386), que gradualmente substituiu o chip de 16 bits em computadores. Durante os anos seguintes, este modelo de programação estendida foi originalmente chamado de arquitetura i386, mas mais tarde apelidou-se de Intel IA-32, antes da sua versão independente, a arquitetura IA-64. Em 1999-2003, a AMD estendeu essa arquitetura de 32 bits para 64 bits e se refere a ele como x86-64 em documentos antigos e mais tarde como AMD64. a Intel logo adotou extensões da arquitetura da AMD, como o nome IA-32e que foi mais tarde renomeado de Intel EM64T e, finalmente, 64. Entre estes cinco nomes, o original x86-64 é provavelmente o mais utilizado, embora a Microsoft e a Sun Microsystems também usam o termo x64.

Propriedades básicas da arquitetura

[editar | editar código-fonte]

A arquitetura x86 é um comprimento variável de instrução, primeiramente são modelados dois endereços “CISC” com ênfase em compatibilidade com versões anteriores. No entanto o conjunto de instruções não é típico CISC, mas, basicamente, uma versão estendida e ortogonal de simples oito bits, das arquiteturas 8008, 8080 e 8085. O Byte de endereçamento é suportado e as palavras são armazenadas na memória com ordem de little-endian byte. O acesso à memória para endereços desalinhados é permitido em todos os tamanhos de palavras suportadas. O maior tamanho nativo para aritmética de inteiros e endereços de memória (ou deslocamentos) é de 16, 32 ou 64 bits dependendo da geração da arquitetura (processadores mais recentes incluem um suporte direto para inteiros menores também). Vários valores escalares podem ser tratados simultaneamente, através da unidade SIMD presente em gerações posteriores, conforme descrito abaixo. Compensações imediatas de endereçamento e dados de imediato podem ser expressos em quantidades de 8 bits conforme a frequência que ocorrem os casos ou contextos em que o intervalo de 128 .. 127 é o suficiente. Instruções típicas são, portanto, de 2 ou 3 bytes de comprimento (embora alguns são muito mais longos, e algumas são de byte único). Para melhor conservar o espaço de codificação, a maioria dos registros são expressos em opcodes usando três bits, e no máximo um operando em uma instrução que pode ser um local de memória (alguns projetos "CISC" altamente ortogonais, como o PDP-11, podem utilizar dois). No entanto, esta memória operando também pode ser de destinação (ou a combinação entre fonte e destinação), enquanto o outro operando, a fonte, pode ser tanto registrada quanto imediata. O número relativamente pequeno de registros gerais (também herdados de seus antecessores de 8 bits) fez-se endereçamento de registro relativo (usando pequenas compensações imediatas) como um importante método de acesso a operandos, especialmente na pilha. Muito trabalho foi, portanto, investido na fabricação desses acessos de modo tão rápido como registrar os acessos, ou seja, um ciclo de transferência de instrução, na maioria dos casos em que os dados acessados estão disponíveis no cache de nível superior.

Ponto Flutuante e SIMD

[editar | editar código-fonte]

Um processador de ponto flutuante dedicado com 80 bits de registros internos, o 8087, foi desenvolvido para o original de 8086. Este chip foi posteriormente desenvolvido para o estendido 80387 e, mais tarde incorporado a uma versão de processadores compatíveis a essa funcionalidade no mesmo chip como no processador principal. Além disso, projetos modernos da x86 também incluem uma unidade SIMD em que as instruções podem trabalhar em paralelo (uma ou duas) palavras de 128 bits, cada uma contendo 2 ou 4 números de ponto flutuante (a cada 64 ou 32 bits de largura, respectivamente), ou, alternativamente, 2, 4, 8 ou 16 números inteiros (a cada 64, 32, 16 ou 8 bits de largura, respectivamente). Os amplos registradores SIMD significam que os processadores existentes x86 podem carregar ou armazenar até 128 bits de dados de memória em uma única instrução e também podem executar operações bit a bit (embora não a aritmética de números inteiros) sobre as quantidades de 128-bits em paralelo. Planejados processadores x86 terão operações SIMD de 256 bits (incluindo 256-bit de memória e armazenamento de carga).

As implementações atuais

[editar | editar código-fonte]

Durante a execução, processadores x86 atuais empregam uma decodificação extra para dividir a maioria das instruções em pedaços menores (micro-operações). Estes são então entregues a uma unidade de controle que os armazena em buffer e os agenda em conformidade de acordo com a semântica x86, para que possam ser executadas, parcialmente em paralelo, por uma das várias unidades (mais ou menos especializadas) de execução. Quando foi introduzida, esta abordagem foi por vezes referida como um "núcleo RISC" ou como "tradução RISC", em parte por razões de marketing, mas também porque essas micro-operações compartilham algumas propriedades com certos tipos de instruções RISC. No entanto, o microcódigo tradicional (usado desde a década de 1950) também inerentemente compartilha muitas das mesmas propriedades; a nova abordagem difere, principalmente na medida em que a tradução para micro-operações agora ocorrem de forma assíncrona. Não ter que sincronizar as unidades de execução com as etapas de decodificação abre possibilidades para uma análise mais aprofundada do fluxo de código (buffer) e, portanto, permite a detecção de operações que podem ser executadas em paralelo, alimentando simultaneamente mais de uma unidade de execução. Os mais recentes processadores também fazem o oposto quando for o caso, pois eles combinam certas seqüências x86 (como uma comparação seguida de um salto condicional) um processo mais complexo de micro-op, que se encaixa no modelo de execução melhor e, portanto, pode ser executado mais rápido ou com menos recursos da máquina envolvida. Outra forma de tentar melhorar o desempenho é o cache decodificado de micro-operações, de modo que o processador pode acessar diretamente o decodificado de micro-operações a partir de um cache especial, em vez de descodificá-lo novamente. A “Execution Trace Cache” é encontrada na microarquitetura da Intel NetBurst (Pentium 4) é até agora o único exemplo generalizado desta técnica. Transmeta usa um método completamente diferente em seus CPUs x86 compatíveis. Eles usam tradução para converter as instruções x86 para instruções nativas do CPU. Transmeta argumenta que sua abordagem permite projetos de energia mais eficientes, uma vez que a CPU pode abandonar a etapa de decodificação complicada para implementações x86 tradicionais.

Registradores

[editar | editar código-fonte]

A arquitetura x86 tem 8 registradores de uso geral (General Purpose Registers - GPR), 6 registradores de segmento, 1 registrador de flags e um Apontador de Execução (Instruction Pointer). (FIXME: no AMD64/EM64T há mais de 8 GPRs)

Registradores de Uso Geral

[editar | editar código-fonte]

Os 8 GPRs, ou Registradores de Uso Geral, são os seguintes (por ordem de introdução na pilha ao executar a instrução PUSHAD):

  • EAX - Acumulador. Usado em operações aritméticas.
  • ECX - Contador. Usado em loops.
  • EDX - Registrador de Dados. Usado em operações de entrada/saída e em multiplicações e divisões. É também uma extensão do Acumulador.
  • EBX - Base. Usado para apontar para dados no segmento DS.
  • ESP - Apontador da Pilha (Stack Pointer). Aponta para o topo da pilha (endereço mais baixo dos elementos da pilha).
  • EBP - Apontador da base do frame. Usado para aceder a argumentos de procedimentos passados pela pilha.
  • ESI - Índice da fonte de dados a copiar (Source Index). Aponta para dados a copiar para DS:EDI.
  • EDI - Índice do destino de dados a copiar (Destination Index). Aponta para o destino dos dados a copiar de DS:ESI.

Estes 8 registradores têm 32 bits cada um e dizem-se Estendidos. Os 16 bits de ordem mais baixa de cada um dos registradores podem ser acedidos através das versões não estendidas destes. As versões de 16 bits têm os mesmo nomes que as de 32 bits, com excepção de a letra E ser retirada (ex: EAX → AX). As versões estendidas dos registradoress não existem em gerações anteriores à 80386 ― a primeira geração de processadores 32 bits da arquitetura x86.

As versões não estendidas dos quatro primeiros GPRs dividem-se ainda em dois grupos de 8 bits cada um. O octeto (byte) de ordem mais alta é acedido trocando o X por um H (exemplo: AX → AH), e o octeto de ordem mais baixa trocando o X por um L (ex: AX → AL).

Nota: Nos processadores da arquitectura AMD64/EM64T, os GPRs têm 64 bits e pode aceder-se à totalidade dos bits através dos nomes RAX, RCX, RDX, etc. Adicionalmente, existem ainda mais oito GPRs, de 64 bits cada um. Isto só é válido se o processador estiver em Modo Longo.

Registradores de segmento

[editar | editar código-fonte]

Há 6 registradores de segmento.

  • CS - Segmento do Código
  • DS - Segmento de Dados
  • ES - Segmento com dados extra
  • FS - Segmento com mais dados
  • GS - Segmento com ainda mais dados
  • SS - Segmento da Pilha (Stack)

Os segmentos são uma idiossincrasia da arquitetura x86, não existindo em praticamente mais nenhuma arquitetura. Sendo assim, os compiladores de linguagens de alto nível geralmente optam por ignorar os segmentos. Por essa razão, os sistemas operativos modernos para x86 (incluindo o Windows e o Linux) tipicamente fazem todos os registradores de segmento apontar para o mesmo segmento de 4GB. As exceções a essa regra são geralmente o FS e o GS, que são usados para isolar as secções de dados das diferentes threads de um mesmo processo. As outras arquitetura utilizam registradores especiais chamados registradores de thread para esse efeito, os quais não existem no x86.

Registro das flags

[editar | editar código-fonte]

O registrador das flags é chamado EFLAGS (Extended Flags) nas arquitetura de 32 bits, sendo a sua versão de 16 bits chamada simplesmente FLAGS. Tal como com os GPRs, os processador x86 anteriores ao i386 não possuem a versão de 32 bits. Nos processadores de 64 bits, este registrador também tem 64 bits e chama-se RFLAGS.

No esquema abaixo, os 16 bits menos significativos aparecem a cinza, enquanto que os bits a azul apenas existem em processadores da geração do i386 ou posteriores.

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
0 0 0 0 0 0 0 0 0 0 ID VIP VIF AC VM RF
 
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 NT IOPL OF DF IF TF SF ZF 0 AF 0 PF 1 CF

Ao carregar um novo valor no EFLAGS, os bits que aparecem no esquema como 1 ou 0 devem ser carregados como tal, de modo a preservar a compatibilidade do software com gerações futuras da arquitetura.

Note-se que utilizar um método convencional para aceder a este registrador produz um erro do montador (assembler), uma vez que o x86 não fornece nenhuma forma de aceder directamente ao registrador das flags. Para modificar ou ler o eflags é necessário utilizar a instrução pushf (16 bits) ou pushaf (32 bits).

O Apontador de Execução

[editar | editar código-fonte]

O apontador de execução, ou Instruction Pointer (genericamente conhecido na ciência da computação por Program Counter), do x86 é um registo interno que aponta para a próxima instrução a ser executada.

O seu nome é EIP e a parte que contem os 16 bits menos significativos denomina-se IP. Tal como no caso do registo das flags, não é possível utilizar um método convencional para aceder ao apontador de Execução. Ele tem de ser introduzido no stack por meio de uma instrução call ou semelhante.

Registradores x86

[editar | editar código-fonte]

O original Intel 8086 e 8088 tem quatorze registros de 16 bits. Quatro deles (AX, BX, CX, DX) são registradores de propósito geral (GPRS, embora cada um possa ter uma finalidade adicional: por exemplo, apenas CX pode ser usado como um contador com a instrução de loop). Cada um pode ser acessado como dois bytes separados (daí o byte mais alto BX pode ser acessado como BH e byte baixo como BL). Há dois registros de ponteiro: SP, que aponta para o topo da pilha e da BP (base pointer) que é usado para apontar para algum outro lugar na pilha, geralmente acima de variáveis locais. Dois registros (SI e DI) são para a indexação de matriz.

Quatro registradores de segmento (CS, DS, SS e ES) são usados para formar um endereço de memória. O registrador de flags contém sinalizadores como de proceder com tais flags, overflow de flag e underflow de flag. Finalmente, o ponteiro de instrução (IP) aponta para a próxima instrução que será obtida a partir da memória e depois executados.

Na Intel 80286, três registros especiais contém endereços da tabela descrita (GDTR, LDTR, IDTR), e um registo de quarta tarefa (TR).

Com o advento do processador de 32 bits 80386, os registradores de 16 bits, registradores base, registradores de índice, ponteiro de instrução, e registradores de flag, mas não os registradores de segmento, foram ampliados para 32 bits. Este é representado por um prefixo "E" (para Extended) para registrar os nomes em linguagem assembly x86. Assim, o registro AX diferencia o registrador de 16 bits do novo EAX 32-bit, SI corresponde ao menor de 16 bits do ESI, e assim por diante. Os registradores de uso geral, registradores de base e registradores de índice podem ser usados como base em modos de endereçamento, e todos os registos, exceto o ponteiro de pilha pode ser utilizado como índice de endereçamento.

Dois novos registros de segmento (FS e GS) foram adicionados. Com um maior número de registros, instruções e operandos, o formato do binario|código de máquina foi alargado. Para fornecer compatibilidade com versões anteriores, os segmentos com código executável pode ser marcado como contendo ou 16 bits ou 32 bits de instruções. Prefixos especiais permitem a inclusão de instruções de 32 bits em um segmento de 16 bits, ou vice-versa.

Com o 80486 uma unidade de processamento de ponto flutuante (FPU) foi adicionada, com oito registros de 80 bits de largura.

Com o Pentium II, oito registradores de 64 bits MMX foram adicionados. Com o Pentium III, um de 32 bits Streaming SIMD Extension (SSE) de controle / registrador de status (mxcsr) e oito de 128 bits SSE registradores de ponto flutuante (XMM0.. XMM7) foram adicionados [17]. Com o Pentium III, um Streaming SIMD Extension (SSE) de 32 bits, um registrador de controle (MXCSR) e oito registradores SSE de pontos flutuantes de 128 bits (XMM0..XMM7) foram adicionados.

Com o processador AMD Opteron, a arquitetura x86 estendeu os registradores de 32 bits para registradores de 64 bits de uma forma similar como a extensão de 16 bits para 32 bits foi feita, foram adicionadas oito registradores de 64 bits (R8, R9 R15 ..), entre outras. No entanto, essas extensões são apenas utilizáveis em modo de 64 bits. Os modos de endereçamento não mudaram drasticamente a partir do modo de 32 bits, com exceção que a resolução foi estendida para 64 bits, endereços virtuais foram estendidos para 64 bits, a fim de impedir endereços virtuais que se têm revelado problemáticos em outras arquiteturas, e mais alguns detalhes foram drasticamente reduzidos.

Diversas funcionalidades

[editar | editar código-fonte]

Processadores x86 (começando com o 80386) também incluem registradores especiais, tais como registradores de controle (CR0 a 4, CR8 para 64 bits), registradores de depuração (DR0 a 3, mais 6 e 7), os registradores de teste (TR3 através 7; apenas 80.486), registradores descritores (GDTR, LDTR, IDTR), um registrador de tarefas (TR), e modelo especifico de registrador (MSRs, aparecendo com o Pentium).

Segmentação

[editar | editar código-fonte]
Ver artigo principal: Segmentação (memória)

Os Minicomputadores durante o final de 1970 estavam em execução contra o 16-bit com limite de até 64 KB de endereço. Alguns microcomputadores como o PDP-11 utilizavam complexos bancos de comutação de sistemas, ou, no caso da Digital VAX, redesenhado processadores muito mais caro que poderia, isso diretamente com endereçamento de 32 bits.O original 8086, desenvolvido a partir do 8085 um microprocessador simples e principalmente visado muito pequeno e barato, em vez que registradores de segmento simples o que aumentou a largura de endereço de memória de apenas 4 bits. Multiplicando um endereço de 64 KB por 16, o endereço de 20 bits poderá endereçar um total de um megabyte(1.048.576 bytes), que foi uma grande quantidade para um pequeno computador. O conceito de registradores de segmento não era nova para mainframes que muitas vezes era usado segmentação para registar-se e trocar rapidamente as diferentes tarefas. Na prática, a 86 era (é) uma lamentação muito criticada, que complicou muito as muitas tarefas comuns de programação e compiladores. Mas, como também simplificou projeto de hardware e custo, seria a custos competitivos em seus segmentos de mercado dominante. Com o surgimento de padrões como o IBM-PC, os custos de desenvolvimento de programação pode ser espalhado sobre a venda de muitas cópias de software, e a arquitetura acabariam evoluindo para 32 total de memória e até mesmo endereçamento de 64 bits por volta do século XXI.

Dados e / ou de códigos pode ser administrados dentro de "perto de" nos segmentos de 16 bits dentro deste espaço de endereço de 1 MB, ou um compilador poderia operar em um modo "more" (muito) com 32 bits de segmento: offset pares alcançar (apenas) 1 MB. Enquanto que também pode revelar-se bastante limites em meados da década de 1980, que estava trabalhando para o mercado de PC emergentes e que se tornou muito simples para traduzir o software dos antigos 8080, 8085 e Z80 para o novo processador. Em 1985, o modelo de segmento de 16-bit de resolução foi efetivamente fatorado pela introdução de 32-bit registro offset, no projeto 386.

No modo real, a segmentação é obtida mudando o endereço de segmento deixado por 4 bits e adicionando um deslocamento, a fim de receber um endereço de 20 bits no final. Por exemplo, se o DS é A000h e SI é 5677h, DS: SI vai apontar para o DS endereço absoluto × 10h + SI = A5677h. Assim, o espaço de endereços em modo real é de 220 bytes, ou 1 MB, uma figura bastante impressionante para 1978. Todos endereços de memória consistem em um segmento e offset, cada tipo de acesso (código, dados ou pilha) tem um segmento de registro padrão associado com ele (para os dados do cadastro é geralmente DS, para o código é CS, e para a pilha é SS). Para acessar os dados, o registrador de segmento pode ser especificado explicitamente (usando um prefixo substituir segmento) para usar qualquer um dos quatro registradores de segmento.

Neste esquema, dois segmentos de diferentes pares de deslocamento podem apontar em um único local absoluto. Assim, se o DS é A111h e SI é 4567h, DS: SI vai apontar para o A5677h. Este regime torna impossível a utilização de mais de quatro segmentos de uma vez. CS e SS são vitais para o funcionamento correto do programa, de modo que somente DS e ES pode ser usado para apontar para dados segmentos fora do programa (ou, mais precisamente, fora do segmento em execução atualmente do programa) ou a pilha.

No modo protegido, um registrador de segmento, já não contém o endereço físico do início de um segmento, mas contêm um "selector", que aponta para uma estrutura em nível de sistema chamado de segmento descritor. Um descritor de segmento contém o endereço físico do início do segmento, o comprimento do segmento, e permissões de acesso a esse segmento.

O deslocamento é verificado em relação ao comprimento do segmento, com deslocamentos referindo-se a localidades fora do segmento que pode causar uma exceção. Compensações referindo-se a locais dentro do segmento são combinados com o endereço físico do início do segmento a obter o endereço físico correspondente ao offset.

A segmentação da programação e design do compilador é difícil, pois o uso de ponteiros afeta o desempenho.

Referências

  1. «A Rundown of x86 Processor Architecture - Technical Articles». www.allaboutcircuits.com (em inglês). Consultado em 4 de dezembro de 2020 
  2. «x86overview». cs.lmu.edu. Consultado em 4 de dezembro de 2020