Assembleia - Registros

As operações do processador envolvem principalmente o processamento de dados. Esses dados podem ser armazenados na memória e acessados ​​a partir dela. No entanto, ler e armazenar dados na memória retarda o processador, pois envolve processos complicados de enviar a solicitação de dados através do barramento de controle e para a unidade de armazenamento de memória e obter os dados através do mesmo canal.

Para acelerar as operações do processador, o processador inclui alguns locais de armazenamento de memória interna, chamados registers.

Os registradores armazenam elementos de dados para processamento sem ter que acessar a memória. Um número limitado de registros é integrado ao chip do processador.

Registros do processador

Existem dez registros de processador de 32 bits e seis de 16 bits na arquitetura IA-32. Os registros são agrupados em três categorias -

  • Registros Gerais,
  • Registros de controle e
  • Registros de segmento.

Os registros gerais são divididos nos seguintes grupos -

  • Registros de dados,
  • O ponteiro registra e
  • Registradores de índice.

Registros de dados

Quatro registradores de dados de 32 bits são usados ​​para operações aritméticas, lógicas e outras. Esses registros de 32 bits podem ser usados ​​de três maneiras -

  • Como registradores de dados de 32 bits completos: EAX, EBX, ECX, EDX.

  • As metades inferiores dos registros de 32 bits podem ser usadas como quatro registros de dados de 16 bits: AX, BX, CX e DX.

  • As metades inferior e superior dos quatro registros de 16 bits mencionados acima podem ser usadas como oito registros de dados de 8 bits: AH, AL, BH, BL, CH, CL, DH e DL.

Alguns desses registros de dados têm uso específico em operações aritméticas.

AX is the primary accumulator; ele é usado na entrada / saída e na maioria das instruções aritméticas. Por exemplo, na operação de multiplicação, um operando é armazenado no registro EAX ou AX ou AL de acordo com o tamanho do operando.

BX is known as the base register, pois poderia ser usado no endereçamento indexado.

CX is known as the count register, como os registros ECX, CX armazenam a contagem de loop em operações iterativas.

DX is known as the data register. Ele também é usado em operações de entrada / saída. Também é usado com o registro AX junto com o DX para operações de multiplicação e divisão envolvendo valores grandes.

Pointer Registers

Os registros de ponteiro são registros EIP, ESP e EBP de 32 bits e as partes direitas de 16 bits correspondentes IP, SP e BP. Existem três categorias de registradores de ponteiro -

  • Instruction Pointer (IP)- O registro IP de 16 bits armazena o endereço de deslocamento da próxima instrução a ser executada. IP em associação com o registro CS (como CS: IP) fornece o endereço completo da instrução atual no segmento de código.

  • Stack Pointer (SP)- O registro SP de 16 bits fornece o valor de deslocamento dentro da pilha do programa. SP em associação com o registro SS (SS: SP) refere-se à posição atual dos dados ou endereço na pilha do programa.

  • Base Pointer (BP)- O registro BP de 16 bits ajuda principalmente na referência das variáveis ​​de parâmetro passadas para uma sub-rotina. O endereço no registro SS é combinado com o deslocamento no BP para obter a localização do parâmetro. BP também pode ser combinado com DI e SI como base registradora para endereçamento especial.

Registros de índice

Os registradores de índice de 32 bits, ESI e EDI, e suas partes mais à direita de 16 bits. SI e DI são usados ​​para endereçamento indexado e, às vezes, usados ​​em adição e subtração. Existem dois conjuntos de indicadores de índice -

  • Source Index (SI) - É usado como índice de origem para operações de string.

  • Destination Index (DI) - É usado como índice de destino para operações de string.

Registros de controle

O registrador de ponteiro de instrução de 32 bits e o registrador de sinalizadores de 32 bits combinados são considerados os registradores de controle.

Muitas instruções envolvem comparações e cálculos matemáticos e alteram o status dos sinalizadores e algumas outras instruções condicionais testam o valor desses sinalizadores de status para levar o fluxo de controle para outro local.

Os bits de sinalização comuns são:

  • Overflow Flag (OF) - Indica o estouro de um bit de ordem superior (bit mais à esquerda) de dados após uma operação aritmética assinada.

  • Direction Flag (DF)- Determina a direção esquerda ou direita para mover ou comparar os dados da string. Quando o valor DF é 0, a operação da string segue a direção da esquerda para a direita e quando o valor é definido como 1, a operação da string segue a direção da direita para a esquerda.

  • Interrupt Flag (IF)- Determina se as interrupções externas como entrada de teclado, etc., devem ser ignoradas ou processadas. Desabilita a interrupção externa quando o valor é 0 e habilita interrupções quando ajustado para 1.

  • Trap Flag (TF)- Permite configurar o funcionamento do processador em modo de passo único. O programa DEBUG que usamos define o sinalizador de trap, para que pudéssemos passar pela execução de uma instrução de cada vez.

  • Sign Flag (SF)- Mostra o sinal do resultado de uma operação aritmética. Este sinalizador é definido de acordo com o sinal de um item de dados após a operação aritmética. O sinal é indicado pela ordem superior do bit mais à esquerda. Um resultado positivo limpa o valor de SF para 0 e um resultado negativo define para 1.

  • Zero Flag (ZF)- Indica o resultado de uma operação aritmética ou de comparação. Um resultado diferente de zero limpa o sinalizador zero para 0 e um resultado zero define-o como 1.

  • Auxiliary Carry Flag (AF)- Contém o transporte do bit 3 para o bit 4 após uma operação aritmética; usado para aritmética especializada. O AF é definido quando uma operação aritmética de 1 byte causa um transporte do bit 3 para o bit 4.

  • Parity Flag (PF)- Indica o número total de bits 1 no resultado obtido em uma operação aritmética. Um número par de bits 1 limpa o sinalizador de paridade para 0 e um número ímpar de bits 1 define o sinalizador de paridade para 1.

  • Carry Flag (CF)- Contém o transporte de 0 ou 1 de um bit de alta ordem (mais à esquerda) após uma operação aritmética. Ele também armazena o conteúdo do último bit de uma operação de deslocamento ou rotação .

A tabela a seguir indica a posição dos bits de sinalização no registro Sinalizadores de 16 bits:

Bandeira: O D Eu T S Z UMA P C
Bit não: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Registros de segmento

Segmentos são áreas específicas definidas em um programa para conter dados, código e pilha. Existem três segmentos principais -

  • Code Segment- Contém todas as instruções a serem executadas. Um registro de segmento de código de 16 bits ou registro CS armazena o endereço inicial do segmento de código.

  • Data Segment- Contém dados, constantes e áreas de trabalho. Um registro de segmento de dados de 16 bits ou registro DS armazena o endereço inicial do segmento de dados.

  • Stack Segment- Contém dados e endereços de retorno de procedimentos ou sub-rotinas. É implementado como uma estrutura de dados 'pilha'. O registrador Stack Segment ou SS armazena o endereço inicial da pilha.

Além dos registros DS, CS e SS, existem outros registros de segmento extra - ES (segmento extra), FS e GS, que fornecem segmentos adicionais para armazenamento de dados.

Na programação de montagem, um programa precisa acessar os locais de memória. Todos os locais de memória dentro de um segmento são relativos ao endereço inicial do segmento. Um segmento começa em um endereço divisível uniformemente por 16 ou hexadecimal 10. Portanto, o dígito hexadecimal mais à direita em todos esses endereços de memória é 0, que geralmente não é armazenado nos registradores de segmento.

O registrador de segmento armazena os endereços iniciais de um segmento. Para obter a localização exata dos dados ou instrução dentro de um segmento, um valor de deslocamento (ou deslocamento) é necessário. Para fazer referência a qualquer local da memória em um segmento, o processador combina o endereço do segmento no registrador do segmento com o valor de deslocamento do local.

Exemplo

Veja o programa simples a seguir para entender o uso de registradores na programação de assembly. Este programa exibe 9 estrelas na tela junto com uma mensagem simples -

section	.text
   global _start	 ;must be declared for linker (gcc)
	
_start:	         ;tell linker entry point
   mov	edx,len  ;message length
   mov	ecx,msg  ;message to write
   mov	ebx,1    ;file descriptor (stdout)
   mov	eax,4    ;system call number (sys_write)
   int	0x80     ;call kernel
	
   mov	edx,9    ;message length
   mov	ecx,s2   ;message to write
   mov	ebx,1    ;file descriptor (stdout)
   mov	eax,4    ;system call number (sys_write)
   int	0x80     ;call kernel
	
   mov	eax,1    ;system call number (sys_exit)
   int	0x80     ;call kernel
	
section	.data
msg db 'Displaying 9 stars',0xa ;a message
len equ $ - msg  ;length of message
s2 times 9 db '*'

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Displaying 9 stars
*********