Ensamblaje - Variables

NASM proporciona varios define directivespara reservar espacio de almacenamiento para variables. La directiva define ensamblador se utiliza para la asignación de espacio de almacenamiento. Se puede utilizar para reservar e inicializar uno o más bytes.

Asignación de espacio de almacenamiento para datos inicializados

La sintaxis de la declaración de asignación de almacenamiento para datos inicializados es:

[variable-name]    define-directive    initial-value   [,initial-value]...

Donde, nombre-variable es el identificador de cada espacio de almacenamiento. El ensamblador asocia un valor de compensación para cada nombre de variable definido en el segmento de datos.

Hay cinco formas básicas de la directiva define:

Directiva Propósito Espacio de almacenamiento
DB Definir Byte asigna 1 byte
DW Definir palabra asigna 2 bytes
DD Definir palabra doble asigna 4 bytes
DQ Definir palabra cuádruple asigna 8 bytes
DT Definir diez bytes asigna 10 bytes

A continuación se muestran algunos ejemplos del uso de directivas de definición:

choice		DB	'y'
number		DW	12345
neg_number	DW	-12345
big_number	DQ	123456789
real_number1	DD	1.234
real_number2	DQ	123.456

Tenga en cuenta que -

  • Cada byte de carácter se almacena como su valor ASCII en hexadecimal.

  • Cada valor decimal se convierte automáticamente a su equivalente binario de 16 bits y se almacena como un número hexadecimal.

  • El procesador utiliza el orden de bytes little-endian.

  • Los números negativos se convierten a su representación en complemento a 2.

  • Los números de coma flotante cortos y largos se representan utilizando 32 o 64 bits, respectivamente.

El siguiente programa muestra el uso de la directiva define:

section .text
   global _start          ;must be declared for linker (gcc)
	
_start:                   ;tell linker entry point
   mov	edx,1		  ;message length
   mov	ecx,choice        ;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
choice DB 'y'

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

y

Asignación de espacio de almacenamiento para datos no inicializados

Las directivas de reserva se utilizan para reservar espacio para datos no inicializados. Las directivas de reserva toman un solo operando que especifica el número de unidades de espacio que se reservarán. Cada directiva define tiene una directiva de reserva relacionada.

Hay cinco formas básicas de la directiva de reserva:

Directiva Propósito
RESB Reserva un Byte
RESW Reserva una palabra
RESD Reserva una palabra doble
RESQ Reserva una palabra cuádruple
DESCANSO Reserva diez bytes

Múltiples definiciones

Puede tener varias declaraciones de definición de datos en un programa. Por ejemplo

choice	  DB 	'Y' 		 ;ASCII of y = 79H
number1	  DW 	12345 	 ;12345D = 3039H
number2    DD  12345679  ;123456789D = 75BCD15H

El ensamblador asigna memoria contigua para múltiples definiciones de variables.

Múltiples inicializaciones

La directiva TIMES permite múltiples inicializaciones con el mismo valor. Por ejemplo, una matriz denominada marcas de tamaño 9 se puede definir e inicializar a cero utilizando la siguiente declaración:

marks  TIMES  9  DW  0

La directiva TIMES es útil para definir matrices y tablas. El siguiente programa muestra 9 asteriscos en la pantalla:

section	.text
   global _start        ;must be declared for linker (ld)
	
_start:                 ;tell linker entry point
   mov	edx,9		;message length
   mov	ecx, stars	;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
stars   times 9 db '*'

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

*********