Assemblée - Constantes

Il existe plusieurs directives fournies par NASM qui définissent des constantes. Nous avons déjà utilisé la directive EQU dans les chapitres précédents. Nous discuterons en particulier de trois directives -

  • EQU
  • %assign
  • %define

La directive EQU

le EQUdirective est utilisée pour définir les constantes. La syntaxe de la directive EQU est la suivante -

CONSTANT_NAME EQU expression

Par exemple,

TOTAL_STUDENTS equ 50

Vous pouvez ensuite utiliser cette valeur constante dans votre code, comme -

mov  ecx,  TOTAL_STUDENTS 
cmp  eax,  TOTAL_STUDENTS

L'opérande d'une instruction EQU peut être une expression -

LENGTH equ 20
WIDTH  equ 10
AREA   equ length * width

Le segment de code ci-dessus définirait AREA comme 200.

Exemple

L'exemple suivant illustre l'utilisation de la directive 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

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

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

La directive% assign

le %assignLa directive peut être utilisée pour définir des constantes numériques comme la directive EQU. Cette directive permet une redéfinition. Par exemple, vous pouvez définir la constante TOTAL comme -

%assign TOTAL 10

Plus loin dans le code, vous pouvez le redéfinir comme -

%assign  TOTAL  20

Cette directive est sensible à la casse.

Les% définissent la directive

le %definedirective permet de définir à la fois des constantes numériques et des chaînes. Cette directive est similaire à la #define en C. Par exemple, vous pouvez définir la constante PTR comme -

%define PTR [EBP+4]

Le code ci-dessus remplace PTR par [EBP + 4].

Cette directive permet également une redéfinition et est sensible à la casse.