Реализация сортировки выбором на языке ассемблера с использованием библиотеки Irvine
Я реализую сортировку выбором на языке ассемблера, используя irvine32.inc, и я кое-как реализовал ее в меру своих возможностей. Можете ли вы проверить мою функцию сортировки выбором, которую я пытался отлаживать, и она дает мне дополнительный ноль после очень индекса массива, поэтому последние два отсортированных элемента не назначают себя в массиве.
Include irvine32.inc
.data
a3 dword 20,12,10,15,2,62,45,100,300
temp dword ?
.code
swap proc,val1:PTR dword,val2:PTR dword
mov eax,0
mov esi,val1
mov edi,val2
mov eax,[esi]
xchg eax,[edi]
mov [esi],eax
ret
swap endp
Selection_Sort proc,A: PTR DWORD,n:DWORD
Local step:DWORD,min_index:DWORD,i:DWORD
mov eax,0
mov step,eax
forin:
call Display
mov eax,step
mov min_index,eax
inc eax
mov i,eax
fori:
mov esi,[A]
mov edi,[A]
imul ebx,i,type A
add esi,ebx
imul ebx,min_index,type A
add edi,ebx
mov eax,[edi]
mov ebx,[esi]
cmp ebx,eax
jge L1
mov eax,i
mov min_index,eax
L1:
mov eax,n
inc i
cmp i,eax
jl fori
mov eax,step
cmp eax,min_index
je L2
mov esi,[A]
mov edi,[A]
imul ebx,step,type A
add esi,ebx
imul ebx,min_index,type A
add edi,ebx
mov eax,[esi]
mov ebx,[edi]
mov [esi],ebx
mov [edi],eax
L2:
inc step
mov eax,n
dec eax
cmp step,eax
jl forin
ret
Selection_Sort endp
Display proc
mov ECX,lengthof a3 ;Set loop times
mov EDX,offset a3
DisplayLoop:
mov ax,[EDX]
add EDX,2
call writedec
call crlf
loop DisplayLoop
call crlf
ret
Display endp
main proc
call display
INVOKE Selection_Sort,ADDR [a3],lengthof a3
call Display
exit
main endp
end main