Assemblage - Tableaux

Nous avons déjà expliqué que les directives de définition de données à l'assembleur sont utilisées pour allouer du stockage pour les variables. La variable peut également être initialisée avec une valeur spécifique. La valeur initialisée peut être spécifiée sous forme hexadécimale, décimale ou binaire.

Par exemple, nous pouvons définir une variable mot «mois» de l'une des manières suivantes -

MONTHS	DW	12
MONTHS	DW	0CH
MONTHS	DW	0110B

Les directives de définition de données peuvent également être utilisées pour définir un tableau unidimensionnel. Définissons un tableau unidimensionnel de nombres.

NUMBERS	DW  34,  45,  56,  67,  75, 89

La définition ci-dessus déclare un tableau de six mots chacun initialisé avec les nombres 34, 45, 56, 67, 75, 89. Cela alloue 2x6 = 12 octets d'espace mémoire consécutif. L'adresse symbolique du premier nombre sera NUMBERS et celle du second nombre sera NUMBERS + 2 et ainsi de suite.

Prenons un autre exemple. Vous pouvez définir un tableau nommé inventaire de taille 8 et initialiser toutes les valeurs avec zéro, comme -

INVENTORY   DW  0
            DW  0
            DW  0
            DW  0
            DW  0
            DW  0
            DW  0
            DW  0

Qui peut être abrégé en -

INVENTORY   DW  0, 0 , 0 , 0 , 0 , 0 , 0 , 0

La directive TIMES peut également être utilisée pour plusieurs initialisations à la même valeur. En utilisant TIMES, le tableau INVENTORY peut être défini comme:

INVENTORY TIMES 8 DW 0

Exemple

L'exemple suivant illustre les concepts ci-dessus en définissant un tableau à 3 éléments x, qui stocke trois valeurs: 2, 3 et 4. Il ajoute les valeurs dans le tableau et affiche la somme 9 -

section	.text
   global _start   ;must be declared for linker (ld)
	
_start:	
 		
   mov  eax,3      ;number bytes to be summed 
   mov  ebx,0      ;EBX will store the sum
   mov  ecx, x     ;ECX will point to the current element to be summed

top:  add  ebx, [ecx]

   add  ecx,1      ;move pointer to next element
   dec  eax        ;decrement counter
   jnz  top        ;if counter not 0, then loop again

done: 

   add   ebx, '0'
   mov  [sum], ebx ;done, store result in "sum"

display:

   mov  edx,1      ;message length
   mov  ecx, sum   ;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
global x
x:    
   db  2
   db  4
   db  3

sum: 
   db  0

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

9