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