array sortieren
-
hallo zusammen
bin grad für meine abschlussprüfungen in informatik am lernen und bin da über ne ASM aufgabe gestolpert, zu der's leider keine musterlösung gibt. deshalb hab ich mir gedacht ich frag mal hier nach
ziel ist es, ein array von zahlen zu sortieren mit zB. bubblesort. dabei sollen die adresse des arrays, sowie dessen grösse auf dem stack übergeben werden. zudem hab ich ne subroutine "swap" zu verfügung, die mir 2 variablen auf dem stack vertauscht.
mein hauptproblem dabei ist die adressierung der einzelnen array elemente. ich hab mir gedacht ich mach 2 for-loops mit datenregister als indizes und adressier die array-elemente mit hilfe der datenregister. weiss aber nicht recht ob das so geht (siehe code).
zudem weiss ich icht so recht, wie ich der subroutine "swap" die parameter übergeben muss. diese müssen ja auf dem stack liegen (die subroutine erwartet das so). deshalb kopier ich meine adressierten array-elemente auf den stack. bin mir da aber ned so sicher ob ich das richtig mach.wär nett wenn mir jmd helfen könnte
gruss biker
Erklärung: A7 ist der stackpointer und A6 ist der Framepointer, der rest ist hoffentlich klar.
var1 DC.b 9,7,1,3,2,4,6,5,8 var2 DC.b 9 _main pea var1 move.l var2,-(A7) bsr sort bra _main sort movem.l D0-D4/A0-A1,-(A7) ;benötigte Register sichern movea.l 32(A7),A0 ;var1 nach A0 kopieren move.l 28(A7),D0 ;var2 in D0, D0 = n for1 move.b #0,D1 ;D1 = i = 0 loop1 cmp.b D0,D1 bgt endfor1 ;solange i < n, dh. D1 < D0 for2 move.b #0,D2 ;D2 = j = 0 move.l D0,D3 subi.b #1,D3 ;D3 = n-1 loop2 cmp.b D3,D2 bgt endfor2 ;solange j < n-1, dh. D2 < D3 move.l D2,D4 addi.b #1,D4 ;D4 = j+1 cmp.b (A0,D2),(A0,D4) ; <-- geht das so??? bls next ;var1[j] < var1[j+1] ? --> ja, weiter. nein, swap move.l (A0,D2),-(A7) ;var1[j] auf stack packen / geht das so??? move.l (A0,D4),-(A7) ;var1[j+1] auf stack packen / geht das so??? bsr swap next addi.b #1, D2 ;j++ bra loop2 endfor2 addi.b #1,D1 ;i++ bra loop1 endfor1 movem.l (A7)+,D0-D4/A0 rtd 8 END
subroutine swap:
swap movem.l A0-A1,-(A7) ;Register sichern link A6,#-2 ;lokaler Variablenbereich für temp movea.l 22(A7),A0 ;adresse von var1 nach A0 movea.l 18(A7),A1 ;adresse von var2 nach A1 move.w (A0),-2(A6) ;temp = var1 move.w (A1),(A0) ;var1 = var2 move.w -2(A6),(A1) ;var2 = temp unlk A6 ;lokaler Variablenbereich freigeben movem.l(A7)+,A0-A1 ;A0 und A1 zurückschreiben rtd 8 ;stack freigeben (var1 und var2 entfernen)