Registradores dos Microprocessadores Intel x86

Quem já teve contato com a linguagem de programação Assembly sabe da importância dos registradores, que são elementos usados para o armazenamento rápido e temporário de memória.
Na programação, usamos constantemente diversos tipos de registradores da arquitetura x86 para guardar dados, mover, copiar e outras coisas, entre registradores ou entre registradores e a memória.

Nesse artigo, de nosso curso de Microprocessador Intel 8086/8088, vamos falar dos registradores visíveis e suas funções.
Visíveis pois podemos manuseá-los diretamente, pois há diversos outros registradores que os programadores não tem acesso durante a criação de um código Assembly.


Os registradores de uso geral do x86

São eles: AX, BX, CX, DX, BP, SI e DI.

Tais registradores são de 16 bits, ou sejam, podem receber ou enviar 16 bits de dados de uma só vez. Porém, alguns destes (AX, BX, CX e DX) são comumente usados como registradores de 8 bits, ou seja, são divididos em dois blocos de 8 bits.

O bloco com os 8 primeiros dígitos são identificados por L, de LOW, e os outros bits são identificados pela letra H, de HIGH.

Assim, o registrador AX é formado por AH e AL.
BX é formado por BH e BL.
CX é formado por CH e CL.
DX é formado por DH e DL.

Eles são ditos de uso geral pois podem ser usados livremente pelo programador Assembly para armazenar e trocar informações em seus códigos da maneira que mais lhe convier.
Vale salientar que, embora sejam de uso geral, eles possuem uso específicos, que serão vistos na seção a seguir, onde daremos mais detalhes sobre cada um deles, suas importâncias e usos especiais.

Mas lembre-se que você poderá usar qualquer um deles em seus programas.
Porém, não é bom sair usando qualquer um aleatoriamente, pois em determinadas rotinas é interessante usar determinados registradores que possuem características que irão nos auxilar.

As características específicas de cada registrador desses, de uso geral, são as seguintes:
  • AX, AH e AL → Registrador Acumulador, muito usado em operação aritméticas, para armazenar o endereço de offset, interrupção e operações com I/O (entrada/saída)
  • BX, BH e BL → Registrador de Base, que guarda o offset do ponteiro de dados
  • CX, CH e CL → Registrador contador, usado para armazenar contagens, com nas instruções LOOP e REP. Esse registro vai incrementando/decrementando automaticamente, conforme sua utilização (em strings, por exemplo)
  • DX, DH e DL → Registrador de dados, usado para instruções de divisão e multiplicação, como o acumulador, além de também ser usado para armazenar o offset de um ponteiro de dados
  • BP → Ponteiro de base, usado para indicar uma posição na transferência de dados na memória
  • SISource Index, usado em instruções que envolvem strings para armazenar o ponteiro da origem
  • DIDestination Index, também usado em strings, onde armazena um ponteiro da base do destino

Os registros de propósito especial

Dentro desta categoria, podemos citar: IP, SP, as Flags e os Registros de Segmento.

  • IP → Ponteiro de instrução, que sempre aponta para a próxima instrução a ser executada em um segmento de código
  • SPStack Pointer, usado nas intruções CALL e RET, para se trabalhar com a pilha
Os dois últimos tipos (de segmento e flags) serão discutidos com mais detalhes em seguida.

Flags

São registros especiais que servem para fazer coisas específicas, como indicar, alterar e controlar algumas características dos microprocessadores.

  • C (Carry) → Além de indicar situações de erro, é usado é operações de adição e subtração (é o 'vai 1' e 'empresta 1' aqui no Brasil)
  • P (Parity) → Se determinado número é ímpar, a flag P assume valor lógico 0, ou valor lógico 1 caso o número seja par
  • A (Auxiliary Carry) → Usada nas instruções DAA e DAS em adição e subtração de números BCD
  • Z (Zero) → Testa se determinada operação terá valor lógico 0. Retorna 1 se o resultado é 0, e 0 se não for
  • S (Sign) → Indica o sinal de um número. Tem valor 1 se o número for negativo, e 0 se for positivo
  • T (Trap) → Habilita o trap do microprocessador, fazendo-o interromper as instruções de acordo com o que houver nos registros de controle e debug
  • I (Interrupt) → Faz as interrupções serem habilitadas quando o pino INTR é 1. Pode ser modificado pelas instruções STI e CLI
  • D (Direction) → Incrementa ou decrementa os registros SI e DI em operações com strings. Se igual 1, o registro automaticamente decrementa, se 0 ele incrementa. Modificado através das instruções STD e CLD
  • O (Overflow) → Usado em operações de adição e subtração para indicar o extrapolamento de endereço

Blog Widget by LinkWithin