Ci risiamo, questo Assembler non mi va proprio giù. Dopo aver perso un giorno intero a fare questo esercizio mi si presenta il seguente errore in ASIM:
"Bus Error: indirizzo inesistente o non valido".
Facendo vari tentativi se metto il codice tutto in Long Word mi funziona a meraviglia, se invece lo rimetto a Word mi da quest'errore.
Sicuramente sto sbagliando qualcosa con gli indirizzi ma non riesco proprio a risolvere, qualcuno che oltre a darmi la dritta su come risolverlo mi spieghi anche il semplice perchè?
Ecco il codice:
*Scrivere un programma che realizzi il confronto tra 5 numeri e li disponga in modo decrescente.
ORG $8000
NumeroDiElementi EQU 5
* Main
Start
lea Risultato,a0 * a0 = puntatore al primo elemento dell'array risultato
move.w a0,a2 * a2 = copia del puntatore al primo elemento dell'array risultato in cui copierò i valori
lea Vettore,a1 * a1 = puntatore al primo elemento dell'array da ordinare
move.w #NumeroDiElementi-1,d0 * d0 = numero di iterazioni (n-1)
move.w d0,d1 * d1 = me ne faccio una copia da usare per ricopiare l'array con indirizzo a1 in a2
LoopCopia
move.w (a1)+,(a2)+ * Copia un elemento da a1 in a2 e passa ai prossimi
dbra d1,LoopCopia * Se d1 non è uguale a -1
LoopPassate
move.w d0,d1 * numero di elementi da confrontare
move.w a0,a1 * puntatore all'elemento più piccolo (inizialmente è quello di riferimento stesso)
move.w (a0),d2 * d2 = elemento corrente da confrontare con gli altri
move.w d2,d3 * d3 = elemento più grande della "passata"
lea 4(a0),a2 * a2 = puntatore all'elemento successivo da confrontare con quello più grande corrente
LoopRicerca
move.w (a2)+,d4 * d4 = elemento successivo da confrontare
cmp.w d4,d3 * Confronto l'elemento più grande della passata con l'elemento attuale da confrontare
bge.s PiuGrande * Se l'elemento in d3 è maggiore o uguale dell'elemento in d4 (quindi non si ha un nuovo maggiore vai a PiuGrande)
move.w d4,d3 * Altrimenti sposta d4 in d3 perchè si ha un nuovo maggiore
lea -4(a2),a1 * Quindi a1 deve puntare a questo nuovo elemento più grande
PiuGrande
subq.w #1,d1 * Diminuire il numero di iterazioni della passata corrente
bne.s LoopRicerca * Se il contatore non è arrivato ancora a 0 continua da LoopRicerca
move.w d3,(a0)+ * Altrimenti il numero di iterazioni è finito quindi d3 va copiato in a0 ed incrementato per puntare al prossimo
move.w d2,(a1) * Visto che il vecchio primo elemento non è più quello più grande lo riposiziono nell'array da ordinare
subq.w #1,d0 * Diminuire il numero di iterazioni del ciclo esterno
bne.s LoopPassate * Se non è uguale a 0 vai a LoopPassata
stop #$2700 * Altrimenti fermati
* Area Dati
ORG $8058
Vettore
DC.W 3
DC.W 5
DC.W 4
DC.W 1
DC.W 2
Risultato
DS.W 5
END START
Precisamente l'errore esce fuorial punto
LoopCopia
move.w (a1)+,(a2)+
Grazie ancora!