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