I have to do insertion sort of numbers in NASM. I have a file which generates random numbers and generate output file with numbers in binary form. My program loads this as input file and should give output with numbers sorted using insertion sort, also in binary form.
My code:
; Template assembler source file
section .text
global _start
_start:
; put your code here
mov eax, 3
mov ebx, 0
mov ecx, array
mov edx, 4*32768
int 80h
mov [fileLength], eax
shr eax,2
dec eax
mov [number], eax
mov ebx, 1
outerloop:
mov ecx,[array + 4*ebx]
mov [item],ecx
mov ecx,ebx
interloop:
mov edx,ecx
dec edx
mov esi, [array + 4*edx]
cmp esi,[array + 4*ecx]
jb koniec
mov eax,[array + 4*edx]
mov [array + 4*ecx],eax
loop interloop
koniec:
mov edx,[item]
mov [array + 4*ecx],edx
inc ebx
cmp ebx,[number]
jne outerloop
mov eax, 4
mov ebx, 1
mov ecx, array
mov edx, [fileLength]
int 80h
; exit to linux
mov eax,1
mov ebx,0
int 80h
; initialized data section
; use directives DB (byte), DW (word), DD (doubleword), DQ (quadword)
section .data
; uninitialized data section
; use directives RESB (byte), RESW (word), RESD (doubleword), RESQ (quadword)
section .bss
fileLength resd 1
number resd 1
array resd 32768
item resd 1
Pseudo code that I used to write insertion sort:
for i ← 1 to i ← length(A)-1
{
// A[ i ] is added in the sorted sequence A[0, .. i-1]
// save A[i] to make a hole at index iHole
item ← A[i]
iHole ← i
// keep moving the hole to next smaller index until A[iHole - 1] is <= item
while iHole > 0 and A[iHole - 1] > item
{
// move hole to next smaller index
A[iHole] ← A[iHole - 1]
iHole ← iHole - 1
}
// put item in the hole
A[iHole] ← item
}
source: http://en.wikipedia.org/wiki/Insertion_sort
My knowledge about it is pretty small and I don’t know what goes wrong. It sometimes sorts first few numbers but the rest of them is not sorted correctly.
You have to change the line
to
and remove
dec eaxbefore yourouterloop. It should work.