Saltar al contenido

Ensamblaje – Registros

septiembre 23, 2021
register1

Las operaciones del procesador implican principalmente el procesamiento de datos. Estos datos se pueden almacenar en la memoria y acceder a ellos desde allí. Sin embargo, leer datos y almacenar datos en la memoria ralentiza el procesador, ya que implica procesos complicados de enviar la solicitud de datos a través del bus de control y dentro de la unidad de almacenamiento de memoria y obtener los datos a través del mismo canal.

Para acelerar las operaciones del procesador, el procesador incluye algunas ubicaciones de almacenamiento de memoria interna, llamadas registros.

Los registros almacenan elementos de datos para su procesamiento sin tener que acceder a la memoria. El chip del procesador incorpora un número limitado de registros.

Registros del procesador

Hay diez registros de procesador de 32 bits y seis de 16 bits en la arquitectura IA-32. Los registros se agrupan en tres categorías:

  • Registros generales,
  • Registros de control y
  • Registros de segmento.

Los registros generales se dividen a su vez en los siguientes grupos:

  • Registros de datos,
  • Registros de puntero y
  • Registros de índice.

Registros de datos

Se utilizan cuatro registros de datos de 32 bits para operaciones aritméticas, lógicas y de otro tipo. Estos registros de 32 bits se pueden utilizar de tres formas:

  • Como registros de datos completos de 32 bits: EAX, EBX, ECX, EDX.

  • Las mitades inferiores de los registros de 32 bits se pueden utilizar como cuatro registros de datos de 16 bits: AX, BX, CX y DX.

  • Las mitades inferior y superior de los cuatro registros de 16 bits mencionados anteriormente se pueden utilizar como ocho registros de datos de 8 bits: AH, AL, BH, BL, CH, CL, DH y DL.

Registros de datos

Algunos de estos registros de datos tienen un uso específico en operaciones aritméticas.

AX es el acumulador principal; se utiliza en entrada / salida y la mayoría de las instrucciones aritméticas. Por ejemplo, en la operación de multiplicación, un operando se almacena en el registro EAX o AX o AL según el tamaño del operando.

BX se conoce como el registro base, ya que podría usarse en direccionamiento indexado.

CX se conoce como el registro de conteo, como ECX, los registros CX almacenan el recuento de bucles en operaciones iterativas.

DX se conoce como el registro de datos. También se utiliza en operaciones de entrada / salida. También se usa con el registro AX junto con DX para multiplicar y dividir operaciones que involucran valores grandes.

Registros de puntero

Los registros de puntero son registros EIP, ESP y EBP de 32 bits y las porciones derechas IP, SP y BP correspondientes de 16 bits. Hay tres categorías de registros de puntero:

  • Puntero de instrucción (IP) – El registro IP de 16 bits almacena la dirección de desplazamiento de la siguiente instrucción que se ejecutará. IP en asociación con el registro CS (como CS: IP) proporciona la dirección completa de la instrucción actual en el segmento de código.

  • Puntero de pila (SP) – El registro SP de 16 bits proporciona el valor de compensación dentro de la pila del programa. SP en asociación con el registro SS (SS: SP) se refiere a la posición actual de los datos o la dirección dentro de la pila del programa.

  • Puntero base (BP) – El registro BP de 16 bits ayuda principalmente a hacer referencia a las variables de parámetro pasadas a una subrutina. La dirección en el registro SS se combina con el desplazamiento en BP para obtener la ubicación del parámetro. BP también se puede combinar con DI y SI como registro base para direccionamiento especial.

Registros de puntero

Registros de índice

Los registros de índice de 32 bits, ESI y EDI, y sus porciones de 16 bits más a la derecha. SI y DI, se utilizan para direccionamiento indexado y, a veces, se utilizan para sumar y restar. Hay dos conjuntos de punteros de índice:

Registros de índice

Registros de control

El registro de puntero de instrucción de 32 bits y el registro de banderas de 32 bits combinados se consideran registros de control.

Muchas instrucciones implican comparaciones y cálculos matemáticos y cambian el estado de los indicadores y algunas otras instrucciones condicionales prueban el valor de estos indicadores de estado para llevar el flujo de control a otra ubicación.

Los bits de bandera comunes son:

  • Bandera de desbordamiento (OF) – Indica el desbordamiento de un bit de datos de orden superior (bit más a la izquierda) después de una operación aritmética con signo.

  • Bandera de dirección (DF) – Determina la dirección izquierda o derecha para mover o comparar datos de cadenas. Cuando el valor de DF es 0, la operación de cadena toma la dirección de izquierda a derecha y cuando el valor se establece en 1, la operación de cadena toma la dirección de derecha a izquierda.

  • Bandera de interrupción (IF) – Determina si las interrupciones externas como la entrada del teclado, etc., deben ignorarse o procesarse. Deshabilita la interrupción externa cuando el valor es 0 y habilita las interrupciones cuando se establece en 1.

  • Bandera de trampa (TF) – Permite configurar el funcionamiento del procesador en modo de un solo paso. El programa DEBUG que usamos establece la bandera de trampa, por lo que podríamos recorrer la ejecución una instrucción a la vez.

  • Bandera de signo (SF) – Muestra el signo del resultado de una operación aritmética. Esta bandera se establece de acuerdo con el signo de un elemento de datos después de la operación aritmética. El signo está indicado por el orden superior del bit más a la izquierda. Un resultado positivo borra el valor de SF a 0 y un resultado negativo lo establece en 1.

  • Bandera cero (ZF) – Indica el resultado de una operación aritmética o de comparación. Un resultado distinto de cero borra el indicador cero a 0 y un resultado cero lo establece en 1.

  • Bandera de transporte auxiliar (AF) – Contiene el acarreo del bit 3 al bit 4 después de una operación aritmética; utilizado para aritmética especializada. El AF se establece cuando una operación aritmética de 1 byte provoca un acarreo del bit 3 al bit 4.

  • Indicador de paridad (PF) – Indica el número total de 1 bits en el resultado obtenido de una operación aritmética. Un número par de 1 bits borra el indicador de paridad a 0 y un número impar de 1 bits establece el indicador de paridad en 1.

  • Llevar bandera (CF) – Contiene el acarreo de 0 o 1 de un bit de orden superior (más a la izquierda) después de una operación aritmética. También almacena el contenido del último fragmento de un cambio o girar operación.

La siguiente tabla indica la posición de los bits de bandera en el registro de banderas de 16 bits:

Bandera: O D I T S Z A PAG C
Bit no: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Registros de segmento

Los segmentos son áreas específicas definidas en un programa para contener datos, código y pila. Hay tres segmentos principales:

  • Segmento de código – Contiene todas las instrucciones a ejecutar. Un registro de segmento de código de 16 bits o un registro CS almacena la dirección de inicio del segmento de código.

  • Segmento de datos – Contiene datos, constantes y áreas de trabajo. Un registro de segmento de datos de 16 bits o registro DS almacena la dirección de inicio del segmento de datos.

  • Segmento de pila – Contiene datos y direcciones de retorno de procedimientos o subrutinas. Se implementa como una estructura de datos de «pila». El registro de segmento de pila o registro SS almacena la dirección de inicio de la pila.

Además de los registros DS, CS y SS, existen otros registros de segmento extra: ES (segmento extra), FS y GS, que proporcionan segmentos adicionales para almacenar datos.

En la programación de ensamblaje, un programa necesita acceder a las ubicaciones de la memoria. Todas las ubicaciones de memoria dentro de un segmento son relativas a la dirección de inicio del segmento. Un segmento comienza en una dirección divisible uniformemente por 16 o hexadecimal 10. Por lo tanto, el dígito hexadecimal más a la derecha en todas esas direcciones de memoria es 0, que generalmente no se almacena en los registros de segmento.

Los registros de segmento almacenan las direcciones de inicio de un segmento. Para obtener la ubicación exacta de los datos o instrucciones dentro de un segmento, se requiere un valor de compensación (o desplazamiento). Para hacer referencia a cualquier ubicación de memoria en un segmento, el procesador combina la dirección del segmento en el registro de segmento con el valor de desplazamiento de la ubicación.

Ejemplo

Mire el siguiente programa simple para comprender el uso de registros en la programación en ensamblador. Este programa muestra 9 estrellas en la pantalla junto con un mensaje simple:

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 '*'

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

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

close