⚙️SEGMENTOS Y REGISTROS

Segmentos de Memoria

Un modelo de memoria segmentada divide la memoria en grupos de segmentos independientes. Cada segmento se utiliza para un tipo de datos, Un segmento contiene el codigo, otro almacena los elementos de datosy un tercero mantiene la pila del programa.

Y tenemos los siguientes segmentos:

  • Data Segment - esta representado por .data y .bss. La seccion data se usa para declarar la region de memoria donde se almacenan los elementos. Esta seccion no se puede expandir despues de declarar los elementos de datos por lo que permanece estatica durante todo el programa. La seccion .bss tambien es una seccion de memoria statica que contiene buffers para que los datos se declaren mas adelante. Esta memoria esta llena de ceros.

  • Code Segment - esta representado por la seccion .txt. este define una area en la memoria donde almacena los codigos de instruccion. Esto tambien es estatico.

  • Stack - este segmento tiene valores de datos que pasan a funciones y procedimientos en el programa.

Registros

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

Los registros almacenan elementos de datos para su procesamiento sin tener que acceder a la memoria

Registros del Procesador

Hay 10 registros del procesador de 32 bits y 6 de 16 bits en la arquitectura IA-32. Los registros se agrupan en tres categorias:

  • General registers

  • Control registers

  • Segment registers

Los registros generales se dividen en:

  • Data Registers

  • Pointer registers

  • Index registers

Data Registers

Se utilizan 4 registtros de datos de 32 bits para operaciones aritmeticas, logicas y de otro tipo. estos registros de 32 bits se pueden utilizar de 3 formas:

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

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

  • Las mitades inferiores y superiores de los 4 registros de 16 bits mensionados anteriormente se pueden utilizar como 8 registros de datos de 8 bits: AH, AL, BH, BL ,CH, CL DH, CL

Algunos de estos registros tienen un uso especifico en operaciones aritmeticas.

AX es el acomulador principal ; se utiliza en la entrada/salida. Por ejemplo en una multiplicacion, operador se almacena en el registro EAX o AX o AL segun el tamaño del operador.

BX registro base ; puede usarse en el direccionamiento indexado.

CX registro de conteo ; ya que los registros ECX, CX,almacenan el conteo de bicles en operaciones iterativas.

DX registro de datos ; tambien se utiliza en operaciones de entrada/salida, se usa con AX para operaciones que tienen grandes valores.

Pointer registers

Estos registros son registros EIP, ESP y EBP de 32 bits y sus porciones IP, SP y BP. Estan estas tres categorias:

  • Instruction Pointer (IP) : El registro IP de 16 bits almacena la direccion de conpensacion de la proxima instruccion que se ejecutara. IP en asiociacion con el registro CS (CS:IP) proporciona la direccion completa de la instruccion actual en el segmento de codigo.

  • Spack Pointer : El registro SP de 16 bits proporciona el valor de desplazamiento dentro de la pila del programa . SP en asociacion del registro SS (SP:SS) se refiere a la posicion actualde los datos o la direccion dentro de la pila del programa.

  • Base Pointer : El registro BP de 16 bits ayuda principalmente a hacer referencia a las variables de parametro pasadas a una subrutina. La direccion de registro SS se conbina con el displazamiento de BP para obtener la ubicacion del parametro. BP se puede conbinar con DI y SI como registro base para direccionamiento.

Index registers

Estos son ESI y EDI de 32 bits y su partes de 16 bits SI y DI, se usan para el direccionamiento indexado. Hay dos conjuntos:

  • Source Index (SI) se usa para strings.

  • Destination Index (DI) se usa como indice de destino de strings.

Control Registers

El Pointer Register de 32 bits y el Flag register de 32 bits conbinados se consideran Control registers.

Los bits de banderas mas comunes son:

  • Overflow Flag (OF) - Indica el desbordamiento de un bit de orden superior (bit mas a la izquierda) de datos despues de una operacion aritmetica con signo.

  • Direction Flag (DF) - Determina la direccion izquierda o derecha para mover o comparar datos de algun string. Cuando el valor DF es 0, la operacion toma direccion de izzquierda a derecha y cuando se establece en 1,a operacion toma direccion de derecha a izquierda.

  • Interrupt Flag (IF) - Determina si las interrupciones externas, como la entrada del teclado etc. Deshabilita la interrupcion externa cuando el valor es 0 y las habilita cuando su valor es 1.

  • Trap Flag (TF) - Permite configurar el funcionamiento del procesador en modo paso unico. El programa DEBUG que usamos establece el indicador de trampa, por lo que podemos pasar por la ejecucion de la instruccion una vez.

  • Sing Flag (SF) - Muestra el signo del resultado de la operacion. el signo esta indicado por el orden superior del bit mas a la izquierda. Un resultado positivo borra el calor SF a 0 y un negativo lo establece en 1.

  • Zero Flag (ZF) - Indica el resultado de una operacion aritmetica o de comparacion. Un resultado distinto de cero lo establece a 0 y un resultado cero lo establece a 1 .

  • Auxiliary Carry Flag (AF) - Contiene el acarreo del bit 3 y del bit 4 siguiendo una operacion aritmetica.

  • Parity Flag (PF) - Indica el numero total de 1-bits en el resultado obtenido de una operacion aritmetica. Un numero par de 1 bits borra el indicador de paridad a 0 y un numero impar de 1 bits establece el indicador de paridad a 1.

  • Carry Flag (CF) - Contiene el acarreo de 0 a 1 de un bit de orden superior. Tambien almacena el contenido del ultimo bit de una operacion de displazamiento o rotacion.

La siguiente tabla indica la posicion de flag bits en 16 bits:

Registros de Segmentos

Los segmentos osn areas especificas definidas de un programa para ontener datos, codigo y pila. Hay tres segmentos principales:

  • Code Segment : Contine las instrucciones a ejecutar. Este segmento de 16 bits o registro CS almacena la direccion inicial del segmento de codigo.

  • Data Segment : Contiene datos, constantes y areas de trabajo. este registro de 16 bits DS almacena la direccion inicial del segmento de datos.

  • Stack segment : Contiene datos y direcciones de retorno de procedimiento o subrutinas. Se implementa como una estructura de datos de pila. Este registro SS almacena la direccion inicial de la pila.

Ademas de estos registros DS, CS y SS existen otros registros de segmentos adicionales: ES (Extra Segment), FS y GS, que dan segmentos adicionales para almacenar datos.

En esta programacion el programa necesita acceder a las ubicaciones de memoria, todas las ubicaciones de un segmento son relativas a la direccion inicial.

Un segmento comienza en una direccion divisible por 16 o por 10 hexadecimal. Por lo tanto un digito hexadecimal mas a la derecha en todas esas direcciones de memoria es 0, que no se almacena en los registros.

Los registros almacenas direcciones iniciales de un segmento, para obtener la ubicacion exacta de datos o instrucciones, se requiere un valor de compensacion (o desplazamiento). Para hacer referencia a cualquier ubicacion de memoria, el procesador combina la direccion del segmento ene l registro del segmento con el valor de compesacionde la ubicacion.

Ejemplo

en este programa se puede comprender el uso de los registros de la programacion Assembly x86:

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

Última actualización