Assembly - Costanti

Esistono diverse direttive fornite da NASM che definiscono le costanti. Abbiamo già utilizzato la direttiva EQU nei capitoli precedenti. Discuteremo in particolare tre direttive:

  • EQU
  • %assign
  • %define

La direttiva EQU

Il EQUviene utilizzata per definire le costanti. La sintassi della direttiva EQU è la seguente:

CONSTANT_NAME EQU expression

Per esempio,

TOTAL_STUDENTS equ 50

È quindi possibile utilizzare questo valore costante nel codice, ad esempio:

mov  ecx,  TOTAL_STUDENTS 
cmp  eax,  TOTAL_STUDENTS

L'operando di un'istruzione EQU può essere un'espressione -

LENGTH equ 20
WIDTH  equ 10
AREA   equ length * width

Il segmento di codice sopra definirà AREA come 200.

Esempio

Il seguente esempio illustra l'uso della direttiva 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 il codice precedente viene compilato ed eseguito, produce il seguente risultato:

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

La direttiva% assign

Il %assigndirettiva può essere utilizzata per definire costanti numeriche come la direttiva EQU. Questa direttiva consente la ridefinizione. Ad esempio, puoi definire la costante TOTALE come -

%assign TOTAL 10

Più avanti nel codice, puoi ridefinirlo come:

%assign  TOTAL  20

Questa direttiva fa distinzione tra maiuscole e minuscole.

La% definisce la direttiva

Il %definela direttiva consente di definire costanti sia numeriche che stringa. Questa direttiva è simile alla #define in C. Ad esempio, puoi definire la costante PTR come -

%define PTR [EBP+4]

Il codice precedente sostituisce PTR con [EBP + 4].

Questa direttiva consente anche la ridefinizione e distingue tra maiuscole e minuscole.