Bubble-sort, Addressierungsprobleme
-
Hallo,
Wir sollen als Übung den Bubble-sort-Algorithmus in 64-bit Netwide Assembler implementieren.
Unser C-Programm übergibt uns die Startstelle des zu sortierenden Arrays in rsi und die Länge in rdi.
Also das ist mein Code bisher:section.text global bubble_sort bubble_sort: loop: mov r14,0 ;äußerer Schleifenzähler auf 0(weil erstes Byte mit 0 addressiert wird) cmp r14,rsi ;Zähler=Länge d. Arrays? je ende ;Ja --> springe zum Ende loop2: mov r13,rsi ;setze r13 auf Länge d. Arrays dec r13 ;setze r13 Auf Länge-1 mov r15,0 ;innerer Schleifenzähler=0(weil erstes Byte mit 0 addressiert wird) cmp r15,13 ;Zähler=Länge-1? je marke1 ;Ja --> springe in die äußere Schleife mov dword r12,[rdi+r15] ;schiebe a[j] in r12 inc r15 ;Zähler+=1 cmp dword r12,[rdi+r15] ;vergleiche a[j] mit a[j+1] jle marke2 ;falls kleiner gleich --> Marke2 mov dword r11,[rdi+r15] ;ansonsten: a[j+1] in r11 xchg dword r11,[rdi+r15] ;a[j] an zweite Stelle dec r15 ;Zähler-1 um wieder an alte Stelle zu kommen xchg dword r12,[rdi+r15] ;a[j+1] an erste Stelle inc r15 ;Zähler wieder +1 marke2 jmp loop2 marke1 inc r14 jmp loop ende ret ;Pseudocode: ; for i from 1 to N ; for j from 0 to N - 1 ; if a[j] > a[j + 1] ; swap( a[j], a[j + 1] )
Wenn ich jetzt versuche zu kompilieren kommt bei mir der Fehler:
"Impossible Combination of address sizes" in den zeilen wo ich versucht habe auf die weiter hinten liegenden Bytes zuzugreifen.Kann mir jemand helfen?
-
r12 und r11 sind 64 Bit Register, es wird aber versuchst sie als 32 Bit Register zu verwenden. Richtig währe z.B.:
mov r12d,[rdi+r15] ; r12d = DWORD = 32 bit
(bis auf wenige Ausnahmen gilt für Register: wenn die Operandengröße 32 Bit ist, werden die oberen 32 Bit des Ergebnisses auf 0 gesetzt )