vuoi
o PayPal
tutte le volte che vuoi
AVVERTENZE
I valori di offset dipendono strettamente dalla dimensione delle variabili, che devono venir memorizzate. Nel caso di
byte lo spiazzamento da considerare è di 1, se word lo spiazzamento è di 2, se di longword lo spiazzamento è pari a 4.
7 byte
6 word
4 longword
0 stack
Nell’area dati, allora, dobbiamo definire delle costanti, che costituiranno i nostri valori di offset.
* Area dati
FAT1 DC.W 4
FAT2 DC.W 3
RIS DS.W 1
OFF1 EQU 8 costante di valore 8
OFF2 EQU 10 costante di valore 10
OFF3 EQU 12 costante di valore 12
Per accedere alla variabile con displacement 8 la sintassi da usare è:
*ESEMPIO MOVE.W OFF1(A6),D n
La traduzione dell’istruzione sopra riportata è all’indirizzo memorizzato nel frame pointer, aggiungi il valore dell’offset e
. In
trasferisci dall’area di memoria corrispondente a quell’indirizzo, il valore in essa conservato al registro D A6
n
abbiamo il valore 0, pertanto sarà acceduto il valore memorizzato alla posizione 8.
Alla routine aggiungiamo ora il codice per trasferire i dati effettivi dallo stack ai registri dato:
MOLT
…
MOVE.W OFF1(A6),D2 al valore contenuto in A6 (cioè 0) aggiungi OFF1 e copia il valore
MOVE.W OFF2(A6),D1 contenuto in quella posizione dello stack all’interno del registro D0
analogamente succede per il registro D1
MOVE.W #0,D0 inizializzazione del registro D0 al valore 0
…
4 –
PASSO LOOP PER LA MOLTIPLICAZIONE
Il loop aggiunge ad un registro vuoto il valore contenuto in D2 (uno dei due fattori) tante volte quante contenute in D1
(l’altro fattore), poiché 4×3 = 4+4+4 oppure 3+3+3+3.
…
LOOP ADD.W D2,D0 al valore in D0 viene aggiunto il contenuto di D2
ADD.W #-1,D1 la variabile contatore è decrementata di un’unità
BNE LOOP se D1 non è uguale a 0, viene ripetuto il ciclo
MOVE.W D0,OFF3(A6) sposta il risultato nello stack alla posizione (A6)+OFF3
… RISULTATO
12 frame pointer+OFF3
FAT2
10 FAT1
8 contenuto
frame pointer
0 stack
5 –
PASSO DEALLOCAZIONE
La deallocazione delle variabili deve avvenire in modo speculare rispetto all’allocazione. Se ad esempio sono
stati messi sullo stack nell’ordine A, B e C dovranno essere deallocati nell’ordine C, B, A. Inoltre se per allocare, lo
stack prevede il decremento, per deallocare viene previsto l’incremento.
…
MOVE.W (SP)+,D2 deallocazione dei registri D2-D0
MOVE.W (SP)+,D1
MOVE.W (SP)+,D0
UNLK A6 ripristino del contenuto del registro A6
RTS ritorno al programma principale
6 –
PASSO CHIUSURA
Al momento del ripristino del registro, che funge da frame pointer, in particolare il contenuto che era stato
A6,
preventivamente salvato nello spazio tra 0 e 8, è stato, ovviamente, liberato. Pertanto all’interno dello stack
risulteranno unicamente le due variabili iniziali ed il risultato. I due operandi, oramai, non hanno più nessuna utilità
per cui vengono deallocati mediante l’istruzione:
…
ADD.W #4,SP il valore è 4 in quanto 2 word prendono uno spazio di 4 byte
… RISULTATO
12 FAT2
10 6 RISULTATO
FAT1
8 4 FAT2
contenuto 2
frame pointer FAT1
0 0
stack stack
Allo stack l’accesso non è più possibile mediante il frame pointer, pertanto viene utilizzato lo stack pointer.