Montagem - Constantes

Existem várias diretivas fornecidas pelo NASM que definem constantes. Já usamos a diretiva EQU em capítulos anteriores. Vamos discutir particularmente três diretivas -

  • EQU
  • %assign
  • %define

A Diretiva EQU

o EQUdiretiva é usada para definir constantes. A sintaxe da diretiva EQU é a seguinte -

CONSTANT_NAME EQU expression

Por exemplo,

TOTAL_STUDENTS equ 50

Você pode então usar este valor constante em seu código, como -

mov  ecx,  TOTAL_STUDENTS 
cmp  eax,  TOTAL_STUDENTS

O operando de uma instrução EQU pode ser uma expressão -

LENGTH equ 20
WIDTH  equ 10
AREA   equ length * width

O segmento de código acima definiria ÁREA como 200.

Exemplo

O exemplo a seguir ilustra o uso da diretiva 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

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

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

A% designar diretiva

o %assignpode ser usada para definir constantes numéricas como a diretiva EQU. Esta diretiva permite redefinição. Por exemplo, você pode definir o TOTAL constante como -

%assign TOTAL 10

Posteriormente no código, você pode redefini-lo como -

%assign  TOTAL  20

Esta diretiva diferencia maiúsculas de minúsculas.

A% define a diretiva

o %definediretiva permite definir constantes numéricas e de string. Esta diretiva é semelhante a #define em C. Por exemplo, você pode definir o PTR constante como -

%define PTR [EBP+4]

O código acima substitui PTR por [EBP + 4].

Essa diretiva também permite a redefinição e faz distinção entre maiúsculas e minúsculas.