Assemblage - Variables
NASM fournit divers define directivespour réserver de l'espace de stockage pour les variables. La directive define assembler est utilisée pour l'allocation de l'espace de stockage. Il peut être utilisé pour réserver et initialiser un ou plusieurs octets.
Allocation d'espace de stockage pour les données initialisées
La syntaxe de l'instruction d'allocation de stockage pour les données initialisées est -
[variable-name] define-directive initial-value [,initial-value]...
Où, nom-variable est l'identifiant de chaque espace de stockage. L'assembleur associe une valeur de décalage pour chaque nom de variable défini dans le segment de données.
Il existe cinq formes de base de la directive define -
Directif | Objectif | Espace de stockage |
---|---|---|
DB | Définir l'octet | alloue 1 octet |
DW | Définir le mot | alloue 2 octets |
DD | Définir un double mot | alloue 4 octets |
DQ | Définir Quadword | alloue 8 octets |
DT | Définir dix octets | alloue 10 octets |
Voici quelques exemples d'utilisation des directives define -
choice DB 'y'
number DW 12345
neg_number DW -12345
big_number DQ 123456789
real_number1 DD 1.234
real_number2 DQ 123.456
Veuillez noter que -
Chaque octet de caractère est stocké sous la forme de sa valeur ASCII en hexadécimal.
Chaque valeur décimale est automatiquement convertie en son équivalent binaire 16 bits et stockée sous forme de nombre hexadécimal.
Le processeur utilise l'ordre des octets petit-boutiste.
Les nombres négatifs sont convertis en représentation complémentaire de 2.
Les nombres à virgule flottante courts et longs sont représentés en utilisant respectivement 32 ou 64 bits.
Le programme suivant montre l'utilisation de la directive define -
section .text
global _start ;must be declared for linker (gcc)
_start: ;tell linker entry point
mov edx,1 ;message length
mov ecx,choice ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
choice DB 'y'
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -
y
Allocation d'espace de stockage pour les données non initialisées
Les directives reserve sont utilisées pour réserver de l'espace pour les données non initialisées. Les directives reserve prennent un seul opérande qui spécifie le nombre d'unités d'espace à réserver. Chaque directive de définition a une directive de réserve associée.
Il existe cinq formes de base de la directive sur les réserves -
Directif | Objectif |
---|---|
RESB | Réserver un octet |
RESW | Réserver un mot |
RESD | Réserver un mot double |
RESQ | Réserver un Quadword |
DU REPOS | Réserver dix octets |
Définitions multiples
Vous pouvez avoir plusieurs instructions de définition de données dans un programme. Par exemple -
choice DB 'Y' ;ASCII of y = 79H
number1 DW 12345 ;12345D = 3039H
number2 DD 12345679 ;123456789D = 75BCD15H
L'assembleur alloue une mémoire contiguë pour plusieurs définitions de variables.
Initialisations multiples
La directive TIMES autorise plusieurs initialisations à la même valeur. Par exemple, un tableau nommé marks de taille 9 peut être défini et initialisé à zéro à l'aide de l'instruction suivante -
marks TIMES 9 DW 0
La directive TIMES est utile pour définir des tableaux et des tableaux. Le programme suivant affiche 9 astérisques à l'écran -
section .text
global _start ;must be declared for linker (ld)
_start: ;tell linker entry point
mov edx,9 ;message length
mov ecx, stars ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
stars times 9 db '*'
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -
*********