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 -

*********