Vettore in assembly x86

Un vettore è una struttura dati ovvero è costituito da una sequenza di dati detti elementi del vettore che occupano locazioni di memoria consecutive.

Dichiarazione di un vettore – primo modo-

<nomeVettore> <tipo> <lista di elementi>

<nomeVettore> deve essere sostituito con il nome che si vuole dare al vettore;
<tipo> deve essere sostituito con db se il vettore è di elementi di dimensione di un byte; deve essere sostituito con dw se il vettore è di elementi di dimensione di 2 byte;
<lista di elementi> contiene i valori con cui devono essere inizializzati gli elementi del vettore, oppure un punto interrogativo per gli elementi non inizializzati.

Esempi:

valori db 1,2,3

dichiara un vettore di tre elementi di un byte inizializzando il primo ad 1, il secondo a 2 e il terzo a 3.

valori db 1,2,?

dichiara un vettore di tre elementi di un byte inizializzando il primo ad 1, il secondo a 2 e il terzo non inizializzato.

valori db ?,?,?

dichiara un vettore di tre elementi di un byte non inizializzati

Dichiarazione di un vettore – secondo modo-

<nomeVettore> <tipo> <numero di elementi> dup (<valore>)

<nomeVettore> deve essere sostituito con il nome che si vuole dare al vettore;
<tipo> deve essere sostituito con db se il vettore è di elementi di dimensione di un byte; deve essere sostituito con dw se il vettore è di elementi di dimensione di 2 byte;
<numero di elementi> deve essere sostituito con il numero di elementi;
<valore> contiene il valore con cui devono essere inizializzati gli elementi del vettore, oppure un punto interrogativo per non inizializzare gli elementi.

Esempi:

valori db 100 dup (1)

dichiara un vettore di 100 elementi di un byte inizializzandoli tutti ad 1.

valori db 100 dup (?)

dichiara un vettore di 100 elementi di un byte non inizializzati.

Accesso agli elementi di un vettore

Il nome del vettore rappresenta il suo indirizzo in memoria ovvero l’indirizzo del suo primo elemento. Quindi per il vettore seguente:

valori db 60 dup (1)

il nome del vettore ‘valori’ indica l’indirizzo ( di spiazzamento o di offset) del primo elemento del vettore questo indirizzo è chiamato anche ‘indirizzo base’.
Ad esempio se il vettore inizia all’indirizzo di spiazzamento [0140h] del segmento dati l’indirizzo fisico del primo elemento vale ds:[0140h] mentre l’indirizzo base vale [0140h].
Quindi si puo fare riferimento:

  • al primo elemento del vettore semplicemente indicando il suo nome (o l’indirizzo base)
  • al secondo elemento del vettore indicando il suo nome +1 (o l’indirizzo base +1)
  • al terzo elemento del vettore indicando il suo nome +2 (o l’indirizzo base+2)
  • al decimo elemento del vettore indicando il suo nome +9 (o l’indirizzo base+9)
  • etc. etc.

Il valore da aggiungere corrisponde al numero di byte che separano l’elemento desiderato dall’indirizzo base;
Il valore da aggiungere detto ‘scostamento’ può essere un valore costante o un valore contenuto in un registro indice;

  • Se ogni elemento occupa un byte lo scostamento per indicare l’elemento n sarà n-1;
  • Se ogni elemento occupa 2 byte (elementi di tipo dw) lo scostamento per indicare l’elemento n sarà (n-1)x2;

In memoria il vettore occupa locazioni consecutive a partire da quella del primo elemento, per la dichiarazione seguente:

valori db 60 dup (1)

il vettore è formato da 60 elementi di un byte tutti inizializzati al valore ‘1’, ipotizzando che il primo elemento del vettore risiede all’indirizzo fisico ds:[0140h] si avrà in memoria la situazione illustrata dallo schema che segue.

celle di memoria del Vettore

Riassumendo

  • Un vettore è una struttura dati costituita da un numero predefinito di byte disposti sequenzialmente in memoria, a partire da un indirizzo detto indirizzo base.
  • Il nome del vettore individua tutto il vettore e identifica l’indirizzo base.
  • Numerando sequenzialmente gli elementi con un indice posizionale l’indirizzo di ogni elemento è dato da: indirizzo elemento= indirizzo base + indice posizionale.
  • Per accedere ad un elemento del vettore occorre conoscere:
    • l’indirizzo base;
    • il numero di byte che separano l’elemento desiderato dall’indirizzo base (l’indice posizionale).

Vediamo come si può accedere agli elementi per il vettore che segue:

valori db 60 dup (1)

Sapendo che:

  • L’indirizzo base è rappresentato dal nome del vettore.
  • L’indice posizionale deve essere contenuto in un registro indice SI o DI.

accedere ad un elemento – primo modo:

supponendo di voler inserire il valore 5 nel primo elemento

mov di,0000h
mov valori[di],5

supponendo di voler inserire il valore 5 nel terzo elemento

mov di,0002h
mov valori[di],5

accedere ad un elemento – secondo modo:

supponendo di voler inserire il valore 5 nel primo elemento

lea bx,valori
mov di,0000h
mov [bx][di],5

supponendo di voler inserire il valore 5 nel terzo elemento

lea bx,valori
mov di,0002h
mov [bx][di],5

in questo secondo modo la scrittura [bx][di] può essere sostituita da [bx+di].
In conclusione si può dire che per accedere agli elementi di un vettore si utilizza l’indirizzamento indicizzato questo significa che l’offset dell’elemento desiderato si ottiene sommando un indirizzo base (nome simbolico o registro base) al contenuto di un registro indice (SI o DI).

accedere ad un elemento – terzo modo:

supponendo di voler inserire il valore 5 nel primo elemento

mov valori[0],5

oppure

mov valori+0,5

supponendo di voler inserire il valore 5 nel terzo elemento

mov valori[2],5

oppure

mov valori+2,5

Per elaborazioni che riguardano tutti gli elementi è conveniente utilizzare un ciclo iterativo in modo da accedere in sequenza a ciascun elemento del vettore. Provate!