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
- SI →Source Index, usado em instruções que envolvem strings para armazenar o ponteiro da origem
- DI → Destination 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
- SP → Stack 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
Nenhum comentário:
Postar um comentário