2011-10-18 11:17:11 +02:00

117 lines
2.1 KiB
NASM

.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