Assembly - Arrays

Abbiamo già discusso che le direttive di definizione dei dati per l'assembler vengono utilizzate per allocare memoria per le variabili. La variabile potrebbe anche essere inizializzata con un valore specifico. Il valore inizializzato può essere specificato in formato esadecimale, decimale o binario.

Ad esempio, possiamo definire una parola variabile "mesi" in uno dei seguenti modi:

MONTHS	DW	12
MONTHS	DW	0CH
MONTHS	DW	0110B

Le direttive di definizione dei dati possono essere utilizzate anche per definire una matrice unidimensionale. Definiamo una matrice unidimensionale di numeri.

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

La definizione precedente dichiara una matrice di sei parole, ciascuna inizializzata con i numeri 34, 45, 56, 67, 75, 89. Questo alloca 2x6 = 12 byte di spazio di memoria consecutivo. L'indirizzo simbolico del primo numero sarà NUMERI e quello del secondo numero sarà NUMERI + 2 e così via.

Facciamo un altro esempio. È possibile definire un array denominato inventario di dimensione 8 e inizializzare tutti i valori con zero, come -

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

Che può essere abbreviato come -

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

La direttiva TIMES può essere utilizzata anche per più inizializzazioni con lo stesso valore. Utilizzando TIMES, l'array INVENTORY può essere definito come:

INVENTORY TIMES 8 DW 0

Esempio

Il seguente esempio dimostra i concetti di cui sopra definendo un array di 3 elementi x, che memorizza tre valori: 2, 3 e 4. Aggiunge i valori nell'array e visualizza la somma 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

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

9