Ensamblaje: segmentos de memoria

Ya hemos hablado de las tres secciones de un programa de montaje. Estas secciones también representan varios segmentos de memoria.

Curiosamente, si reemplaza la palabra clave de la sección con segmento, obtendrá el mismo resultado. Prueba el siguiente código:

segment .text	   ;code segment
   global _start    ;must be declared for linker 
	
_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 eax,1       ;system call number (sys_exit)
   int 0x80	   ;call kernel

segment .data      ;data segment
msg	db 'Hello, world!',0xa   ;our dear string
len	equ	$ - msg          ;length of our dear string

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

Hello, world!

Segmentos de memoria

Un modelo de memoria segmentada divide la memoria del sistema en grupos de segmentos independientes referenciados por punteros ubicados en los registros de segmento. Cada segmento se utiliza para contener un tipo específico de datos. Un segmento se usa para contener códigos de instrucción, otro segmento almacena los elementos de datos y un tercer segmento mantiene la pila del programa.

A la luz de la discusión anterior, podemos especificar varios segmentos de memoria como:

  • Data segment - Está representado por .data sección y la .bss. La sección .data se utiliza para declarar la región de memoria, donde se almacenan los elementos de datos para el programa. Esta sección no se puede expandir después de que se declaran los elementos de datos y permanece estática en todo el programa.

    La sección .bss también es una sección de memoria estática que contiene búferes para que los datos se declaren más adelante en el programa. Esta memoria intermedia está llena de ceros.

  • Code segment - Está representado por .textsección. Esto define un área en la memoria que almacena los códigos de instrucción. Esta también es un área fija.

  • Stack - Este segmento contiene valores de datos que se pasan a funciones y procedimientos dentro del programa.