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)
    

Anmelden zum Antworten