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.