2013-12-19 22:22:57 +01:00

95 lines
1.8 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:
movl length, %ecx # %ecx = n
subl $1, %ecx # n - 1
movl $0, %edi # %edi mit 0 initialisieren
##############################################################################
.schleife_aussen:
pushl %ecx # Speicher den Wert von %ecx auf Stack
#########################################################
.schleife_innen:
movl list(,%edi, 4), %eax # %eax = j
inc %edi # %edi um 1 erhöhen
movl list(,%edi, 4), %ebx # %ebx = j+1
dec %edi # %edi wieder auf 0 setzen
cmp %eax, %ebx # vergleiche nun j und j+1 und springe zu den passenden Labels
jb .true
jmp .false
.true:
# Registertausch:
xchgl %eax, %ebx
movl %eax, list(,%edi, 4) # zurück ins Datenfeld schreiben
inc %edi
movl %ebx, list(,%edi, 4) # zurück ins Datenfeld schreiben
dec %edi
.false:
# Weiter im Code
inc %edi # %edi um 1 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
xor %edi, %edi # %edi wieder auf 0 setzen
loop .schleife_aussen
##################################################################################
#### 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