.data # zu sortierende List einkommentieren # list: .long 10,9,8,7,6,5,4,3,2,1 list: .long 16,5,18,12,11,66,62,1,9,33 # Länge der Liste: length: .long 10 intout: .string "Sortierte Liste: %d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n" .text .globl main main: leal list, %esi # Laden der Adresse mach %esi leal length, %edi # Laden der Adresse nach %edi call .bubble_sort # Aufruf von Unterprogramm jmp .ende .bubble_sort: # Basepointer muss nicht gesichert werden. Das übernimmt der call-Befehl! movl (%edi), %ecx # lese Wert von length dec %ecx # length - 1 xor %edi, %edi # %edi = 0 movl %esi, %edi ############################################################################## .schleife_aussen: pushl %ecx # Speicher den Wert von %ecx auf Stack ######################################################### .schleife_innen: movl 0(%edi), %eax # %eax = Wert an Adresse %edi (j) movl 4(%edi), %ebx # %ebx = Wert an Adresse %edi + 4 (j + 1) cmp %eax, %ebx # vergleiche nun j und j+1 und springe zu den passenden Labels jb .true jmp .false .true: # Registertausch: movl %ebx, 0(%edi) # zurück ins Datenfeld schreiben movl %eax, 4(%edi) # zurück ins Datenfeld schreiben .false: # Weiter im Code addl $4, %edi # Adresse in %edi um 4 erhöhen, um nun das nächste Paar im Array zu vergleichen loop .schleife_innen ########################################################## popl %ecx # ursprünglichen Wert von %ecx vom Stack holen movl %esi, %edi loop .schleife_aussen ################################################################################## ret # Unterprogramm verlassen .ende: #### Ausgabe #### movl length, %esi # Kopiere Arraygröße nach %esi(= k) .printElement: cmpl $0 , %esi # Vergleiche %esi = 0 ? je .callPrintf # Wenn ja ,springe zu callPrintf dec %esi # Veringere %esi um 1 movl list(,%esi,4) , %ecx # Kopiere a[k] nach %ecx pushl %ecx # pushl auf Stack jmp .printElement .callPrintf: pushl $intout call printf # Exit movl $1, %eax int $0x80