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