Ensamblaje - Constantes

NASM proporciona varias directivas que definen constantes. Ya hemos utilizado la directiva EQU en capítulos anteriores. En particular, discutiremos tres directivas:

  • EQU
  • %assign
  • %define

La Directiva EQU

los EQULa directiva se utiliza para definir constantes. La sintaxis de la directiva EQU es la siguiente:

CONSTANT_NAME EQU expression

Por ejemplo,

TOTAL_STUDENTS equ 50

Luego puede usar este valor constante en su código, como:

mov  ecx,  TOTAL_STUDENTS 
cmp  eax,  TOTAL_STUDENTS

El operando de una instrucción EQU puede ser una expresión:

LENGTH equ 20
WIDTH  equ 10
AREA   equ length * width

El segmento de código anterior definiría AREA como 200.

Ejemplo

El siguiente ejemplo ilustra el uso de la directiva EQU:

SYS_EXIT  equ 1
SYS_WRITE equ 4
STDIN     equ 0
STDOUT    equ 1
section	 .text
   global _start    ;must be declared for using gcc
	
_start:             ;tell linker entry point
   mov eax, SYS_WRITE         
   mov ebx, STDOUT         
   mov ecx, msg1         
   mov edx, len1 
   int 0x80                
	
   mov eax, SYS_WRITE         
   mov ebx, STDOUT         
   mov ecx, msg2         
   mov edx, len2 
   int 0x80 
	
   mov eax, SYS_WRITE         
   mov ebx, STDOUT         
   mov ecx, msg3         
   mov edx, len3 
   int 0x80
   
   mov eax,SYS_EXIT    ;system call number (sys_exit)
   int 0x80            ;call kernel

section	 .data
msg1 db	'Hello, programmers!',0xA,0xD 	
len1 equ $ - msg1			

msg2 db 'Welcome to the world of,', 0xA,0xD 
len2 equ $ - msg2 

msg3 db 'Linux assembly programming! '
len3 equ $- msg3

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

Hello, programmers!
Welcome to the world of,
Linux assembly programming!

La directiva% asignar

los %assignLa directiva se puede usar para definir constantes numéricas como la directiva EQU. Esta directiva permite la redefinición. Por ejemplo, puede definir la constante TOTAL como -

%assign TOTAL 10

Más adelante en el código, puede redefinirlo como:

%assign  TOTAL  20

Esta directiva distingue entre mayúsculas y minúsculas.

La Directiva% define

los %defineLa directiva permite definir tanto constantes numéricas como de cadena. Esta directiva es similar a #define en C. Por ejemplo, puede definir la constante PTR como -

%define PTR [EBP+4]

El código anterior reemplaza PTR por [EBP + 4].

Esta directiva también permite la redefinición y distingue entre mayúsculas y minúsculas.