www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 8051 ASM Bubblesort


Autor: t.tichi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen,

ich hab ein kleines Problem bei dem ich irgendwie nicht weiter komme. Es 
geht um die Umsetzung des Bubblesort algorithmusses in Assembler für den 
8051.
Ich habe im externen RAM die Zahlen, welche sortiert werden sollen 
abgelegt. Und wenn ich mich richtig erinnere, dann ist die äußere 
Schleife n-1
Habe beim googeln diverse Ausführung in Pseudocode gefunden, aber irgendwie komme ich nicht damit zurecht. Zur Erinnerung:

/* bubble sort pseudocode
  for(i=(arraySize - 1); i>=0; i--)
    for(j=1; j<=1; j++)
      if(arrayOfLetters[j-1] < arrayOfLetters[j])
      {
        temp = arrayOfLetters[j-1]
        arrayOfLetters[j-1] = arrayOfLetters[j]
        arrayOfLetters[j] = temp
      }
*/
Und ich habe dann mal folgendes draus gemacht:
sortieren:
    mov r0, #04h

    loop1:                                                       
          mov dptr, #9006h       
          mov a, r0                                        
          mov r1, a 
        
          loop2:
                movx a, @dptr                        
                mov r2, a 
                inc dptr 
                movx a, @dptr 
                subb a, r2    
                jnc continue2        
                
                swapnumbers:
                        movx a, @dptr               
                        xch a, r2                  
                        movx @dptr, a           
                        dec dpl                               
                        mov a, r2                        
                        movx @dptr, a                
                        inc dptr                    
        
    continue2: djnz r1, loop2    

continue1: djnz r0, loop1              
jmp ausgabe


Wenn ich das ganze im Singlestep einfach mal im Debugger laufen lasse, 
dann meine ich zu sehen, dass der Fehler beim Schleifenkonstrukt liegen 
muss. Vielleicht ist ja jemand so nett und hilft mir auf die Sprünge

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
field_size      equ     4
field_start     equ     9006h

bubblesort:
        mov     r7, #field_size - 1
_bs1:
        mov     a, r7
        mov     r6, a
        mov     dptr, #field_start
_bs2:
        movx    a, @dptr
        mov     r5, a
        inc     dptr
        movx    a, @dptr
        clr     c
        subb    a, r5
        jnc     _bs4

        xch     a, dpl          ; dec dptr
        jnz     _bs3            ;
        dec     dph             ;
_bs3:                           ;
        dec     a               ;
        xch     a, dpl          ;

        movx    @dptr, a        ; store in reverse order
        inc     dptr
        mov     a, r5
        movx    @dptr, a
_bs4:
        djnz    r6, _bs2
        djnz    r7, _bs1
        ret


Peter

Autor: t.tichi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter und danke für deine Mühe.

Ich muss aber gestehen, dass mir deine Lösung nicht ganz klar ist. 
Getestet habe ich sie natürlich auch, um es evtl. Schritt für Schritt 
nachvollziehen zu können und ein Fehler müsste dort auch noch drin sein, 
wenn ich richtig geschaut habe.

Undzwar folgende Passage:
xch     a, dpl          ; dec dptr
        jnz     _bs3            ;
        dec     dph             ;
_bs3:                           ;
        dec     a               ;
        xch     a, dpl          ;

        movx    @dptr, a        ; store in reverse order
        inc     dptr
        mov     a, r5
        movx    @dptr, a

Führt zu gänzlich falschen Zahlenwerten im Ziel"array". Mir ist auch 
nicht ganz klar, warum du diesen Weg gewählt hast. Der DPTR besteht ja, 
so wie du es auch anwendest, aus niederwertigen 8-bit und höherwertig 
8-bit = 16bit total. Was ich allerdings nicht verstehe ist der Punkt, 
warum du ein xch auf den Zeiger selbst anwendest. Stehe ich da total auf 
dem Schlauch?

Autor: t.tichi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider keine Edit Funktion, daher muss ich einfach noch mal antworten. 
Ich habe mal eben den Teil etwas umgeschrieben und 2-3 getestet. 
Funktioniert, so wie ich das sehen kann. Ergebnis stimmt auch.
  sortieren:
    mov a, r3
    subb a,#1
    mov r7,a
  
  _bs1:
    mov a,r7
    mov r6,a
    mov dptr, #9006h
  
  _bs2:
    movx a, @dptr
    mov r5, a
    inc dptr
    movx a, @dptr
    clr c
    subb a, r5
    jnc _bs4

  _bs3:
    movx a, @dptr
    xch a, r5
    movx @dptr, a
    dec dpl
    mov a, r5
    movx @dptr, a
    inc dptr
    
  _bs4:
    djnz r6, _bs2
    djnz r7, _bs1
    jmp ausgabe

Ist noch ein bisschen wüst, aber es scheint erstmal zu tuen und ich kann 
endlich schlafen gehen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.