Archivi tag: programmazione

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!

Ciclo precondizionato in Assembly: somma dei primi N

Vediamo un esempio di utilizzo di ciclo precondizionato in Assembly.
Non disponiamo di una struttura pronta come accade nei linguaggi ad alto livello quindi dovremmo implementare il ciclo utilizzando opportunamente le istruzioni di salto.

Problema
Voglio sviluppare, in linguaggio Assembly x86, un programma che effettui la somma dei primi N numeri interi con N acquisito in input.

Analisi e progetto
Il programma dovrà acquisire il valore di N in input e sommare tutti i numeri da 1 a N. Esempio: se venisse fornito in input il valore 5 il programma dovrebbe fornire il valore 1+2+3+4+5 ovvero 15 ovvero la somma dei primi 5 numeri interi.
Dati
n  variabile di tipo intero a 8 bit (contiene il valore di N);
somma variabile di tipo intero a 8 bit (contiene la somma dei numeri);
conta variabile di tipo intero a 8 bit (contiene il valore da sommare, varia da 1 a N).

Algoritmo in pseudocodice

Programma sommaN
 leggi n;
 somma <-- 0;
 conta <-- 0;
 Mentre conta < n esegui
    conta <-- conta + 1;
    somma <-- somma + conta;
 FineMentre
Fine.

Codice sorgente

.model small
.stack 100h
.data
 n db ?
 somma db 0h
.code
 inizio:
 mov ax,@data
 mov ds,ax
 
 mov ah,01h          ; input di n
 int 21h
 sub al,30h
 mov n,al
 
 mov cl,00h         ; uso cl come contatore (da 0 a n)
 iniziociclo:
 cmp cl,n
 jnb finementre
   inc cl
   add somma,cl
   jmp iniziociclo
 finementre:
 
 mov ah,4Ch
 int 21h
end inizio

Il programma proposto utilizza un ciclo a controllo in testa (precondizionato) e un contatore crescente (da 1 a N).

Proposte di lavoro
1. Verifica il funzionamento del programma.
2. Sviluppa un programma per lo stesso problema che utilizzi un contatore decrescente.
3. Sviluppa un programma per lo stesso problema che utilizzi un ciclo a controllo in coda.
4. Modifica il programma in modo che fornisca in output il valore calcolato della somma.

Eventuali domande nei commenti. Buon lavoro!

 

SOLE

bimbo al computerSelf Organized Learning Environments (SOLE) – “Luoghi di apprendimento auto-organizzati”. Bambini che imparano insieme, senza insegnante, possibile? sembrerebbe proprio di si a sentire (in questo video)  Sugata Mitra.

Lo stesso metodo è utilizzato in CoderDojo laboratori di programmazione per bambini che stanno riscuotendo sucesso in mezzo mondo. Oggi il Coderdojo si tiene a Milano, se ne può leggere nell’apposito sito.

Un esperienza da studiare per chi insegna programmazione.

Sei un insegnante? trasformati in una nonna!