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 )


Anmelden zum Antworten