A Intel e seu processador de 16 bits…

Mais nostalgia pra vocês… Dessa vez, sobre o 8086.

IBM PC modelo 5150. Bonito, não?

No início dos anos 80 a IBM apresentou ao mundo o IBM PC Modelo 5150, baseado no processador 8088. O 8088 é uma versão com barramento de dados de 8 bits do 8086 e essa foi a arquitetura escolhida porque já existiam muitos microcomputadores de 8 bits no mercado e componentes eletrônicos especializados para eles. A intenção não era reinventar a roda em todo o circuito.

Na época existia uma boa briga, especialmente entre a Apple, com seu Apple ][ (e mais tarde com o MacIntosh) e a IBM e os PCs… Muitos, como eu próprio, acreditavam que o aumento de 8 para 16 bits era um senhor avanço, mas que a alusão a “Personal Computer” era exagerada. O bicho era caro, grande e com cara “profissional” demais para ser “pessoal”. E, ainda por cima, era da IBM! Era quase como almejar comprar um carro zero quilômetro fabricado pela NASA!

Por incrível que pareça, os modelos de PCs da IBM, até os AT (de Advanced Technology), jamais usaram o 8086… Felizmente a empresa, logo no início, abriu toda a documentação do bicho e começaram a surgir clones e esses modificaram o circuito para uso do 8086.

Família de processadores 8086

Os 8088/8086 eram os irmãos maiores do antigo 8085 e, esse último, uma versão um pouco melhor do 8080, ambos de 8 bits. Neles tínhamos registradores de uso geral A, B, C, D, E, H e L, bem como PC (de Program Counter), SP (Stack Pointer) e Flags… Nos 8086 a Intel manteve A, B, C e D, estendendo-os para 16 bits e, por isso eles têm um X após seus nomes (X de eXtended)… A intenção por trás de H e L, nos 8080, sempre foi o uso do par HL, onde H é o MSB e L o LSB. De fato, nos 8080 e 8085 o par HL, quando usado como ponteiro, forma um pseudo registrador chamado M (de Memory). Assim, os registradores AX, BX, CX e DX puderam ser “desmembrados” em seus bytes de alta e baixa ordem, como em AH e AL.

Os registradores PC e SP continuam lá e funcionam igualzinho, mas para dar um “plus” ao conjunto de instruções — e tentar competir com o Z80 — a Intel resolveu flexibilizar o esquema de endereçamento para as instruções. É bom lembrar que no Z80 existem 3 maneiras de usar ponteiros:

  • Via endereçamento absoluto, como em LD A,(0xC010);
  • Via endereçamento indireto, como em LD A,(HL);
  • Via endereçamento indireto indexado, como em LD A,(IX+1)

A Intel resolveu criar o esquema de endereçamento com até 3 “operandos”: endereço base, índice e offset, como em MOV AL,[BX+SI+2]. Mas existe um problema: Somente os registradores BX e BP podem ser usados como “base” (por isso o B na frente do nome) e somente SI (de Source Index) e DI (de Destination Index) podem ser usados como índice (e por isso esses dois registradores existem — e não podem ser “desmembrados” como seus irmãos que terminam com X). Esse esquema de endereçamento só foi flexibilizado nos 80386 ou superiores.

Observação: O registrador BP não existe para apontar para a “base da pilha”, mas para ser usado como ponteiro e compor o “endereço base” no esquema de endereçamento dos 8086 quando se trata de acesso à pilha!

Endereços maiores que 16 bits

Na época era pouco comum obter um microcomputador que tivesse mais que uns 48 KiB de RAM. Outro atrativo do IBM PC-5150 era a “enorme” quantidade de memória que o sistema poderia suportar: 256 KiB! Mas, para que isso acontecesse era necessário que o barramento de endereços tivesse mais que 16 bits. Foi resolvido que teria 20 e uma capacidade teórica “absurda” de 1 MiB de memória acessível!!!

Mas, como especificar 20 bits de endereços com registradores de 16 bits? Ainda, a maioria dos desenvolvedores (mesmo em linguagem Assembly) estavam mais que acostumados em lidar com endereços de 16 bits nos processadores de 8… A solução foi particionar a memória em “segmentos” de 64 KiB cada. Surgem os “registradores de segmento” (que mais tarde viriam a ser renomeados de “seletores”). A única “desvantagem” é que o endereço linear base tem que ser, necessariamente, alinhado de 16 em 16 bytes (os 4 bits inferiores dos 20 são sempre zero e os registradores de segmento especificam os 16 bits superiores)… Isso causa um possível overlapping entre segmentos, quebrando a vantagem do isolamento entre eles.

Sobre esse “isolamento”, a segmentação tenta matar outro coelho: Em computadores maiores era normal que existisse memórias dedicadas. Uma para o armazenamento das instruções do programa, outra para armazenamento dos dados manipulados, outra para a pilha… Com os seletores pode-se especializar um segmento… Então, CS indica o endereço base do segmento de “código” (Code Segment); DS o de dados (Data Segment) e SS, o de pilha (Stack Segment). E só para dar uma flexibilizada (ou para facilitar o circuito interno do processador) adicionaram ES (Extra data Segment).

Com isso, dependendo do registrador de uso geral que for usado como endereço base (BX ou BP), seleciona-se, automaticamente, DS ou SS, respectivamente.

Outras restrições em relação ao 286 e 386

Em instruções de deslocamento ou rotação não se podia fazer algo como SHL AX,3. Ou se deslocava apenas 1 bit ou tínhamos que usar o registrador CL como operando da contagem do deslocamento. Isso foi flexibilizado, se não me engano, no 286.

Os 386 melhoraram um bocado, “melhorando” o tamanho dos registradores: EAX (de Enhanced AX) torna AX a WORD menos significativa de EAX, que agora tem 32 bits (mas, repare que AH e AL continuam lá, como o desmembramento de AX). E também flexibiliza o modelo de endereçamento. Agora podemos usar qualquer registrador de uso geral como base ou índice, como em MOV AL,[ECX+EDX+1] e, melhor ainda, podemos escalonar o índice, multiplicando-o por 2, 4 ou 8, como em MOV EAX,[ECX+4*EDX+1]… Podemos também usar tanto EBP quanto ESP se quisermos que a base selecione SS automaticamente. E, é claro, temos um conjunto de instruções muito maior.

O 286 também introduziu o modo protegido, melhorado no 386 (que adicionou, também, o modo paginado – para competir com o MC68030, da Motorola).

Para saber mais sobre os 8086 leia meu “Curso de Assembly”, escrito em 1994 para a RBT (baixe aqui). É material velho, mas, em essência, ainda válido.