95 lines
1.8 KiB
NASM
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 |