Bus Error: Indirizzo inesistente

di il
4 risposte

Bus Error: Indirizzo inesistente

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!

4 Risposte

  • Re: Bus Error: Indirizzo inesistente

    Il problema potrebbe dipendere dalla

    move.w a0,a2

    che deve essere

    move.l a0,a2

    Questo perché se il registro a2 contiene FFFFFFFF

    e il registro a0 contiene 00008062

    dopo la copia della word a2 potrebbe contenere

    FFFF8062

    evidentemente sbagliato.
  • Re: Bus Error: Indirizzo inesistente

    E' vero. Andando step-by-step l'indirizzo a2 diventava proprio FFFF8062 del tutto sbagliato. Cosa che poi succede anche più avanti move.w a1,a0 che ho dovuto riscriverlo come move.l a1,a0.

    Non mi è molto chiaro come mai il registro a2 contiene FFFFFFFF (valore a caso?), ma dicendo una cosa stupida, per risolvere l'errore sarebbe bastata una clear prima di utilizzarlo?

    Grazie ancora per avermi aiutato

    Edit: Dimenticavo...in definitiva posso pensarla che con gli indirizzi è meglio lavorarci da long word?
  • Re: Bus Error: Indirizzo inesistente

    Sì il valore è iniziale imprevedibile. E ancora sì, puoi fare un clear, ma perché fare un'istruzione in più quando basta prevedere la copia totale dell'indirizzo?

    Del resto perché tu copi solo la word bassa? Un indirizzo completo è a 32 bit, non importa se scrivi 8000, devi considerare che sia 00008000 e non altro.
  • Re: Bus Error: Indirizzo inesistente

    Sempre molto chiaro e gentile!
    Credo di aver capito qualcosa in più adesso
    Grazie mille!
Devi accedere o registrarti per scrivere nel forum
4 risposte