B
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)