我正在尝试使用从大到小的寄存器对数组进行排序,但似乎没有任何效果。 ecx是我拥有的数字量,esi是我的由双字组成的列表的地址。我使用edx将每个元素向上增加4个字节。我的代码没有对整个数组进行排序,我知道我需要找到max的位置,然后将其设置为等于外部循环edx,但是我似乎无法弄清楚如何更改数组中的元素,因为我仅具有edx寄存器。我尝试推动该位置,然后在内循环完成时将其弹出,但似乎不起作用。谢谢您,我已经在这个问题上工作了4个多小时。
push ebp
mov ebp,esp
mov ecx,[ebp+8]
mov esi,[ebp+12]
mov edx,-4
outerloop:
add edx,4
push edx
push ecx
mov ebx,[edx+esi]
innerloop:
add edx,4
mov eax,[edx+esi]
cmp ebx,eax
jl change
finish:
loop innerloop
pop ecx
pop edx
loop outerloop
jmp done
change:
mov [edx+esi],ebx
mov [edx+esi-4],eax
sub edx,4
push edx
mov edx,offset change1
call writestring
pop edx
jmp finish
done:
pop ebp
ret 8
答案 0 :(得分:0)
您要查找的是一个'reversed'Bubble Sort(当然,您可以使用所需的任何排序算法,但这只是一个示例)。我不确定您使用的是哪种汇编程序,但这是一个简短的汇编函数,它将完成存储在数组/列表n
中的arr
int32_t整数类型。 (此示例是用NASM编写的)
;int *sort(int *arr,int n);
sort:
push ebp
mov ebp,esp
mov edx,[ebp+12]
.loop1:
mov esi,[ebp+8] ;arr ptr
mov ecx,[ebp+12] ;n number of ints
.loop2:
mov eax,[esi] ;compare
mov ebx,[esi+4]
cmp eax,ebx
jg .skip
mov [esi],ebx ;swap
mov [esi+4],eax
.skip:
add esi,4 ;perform loop checks
dec ecx
cmp ecx,1
ja .loop2
dec edx
ja .loop1
mov eax,[ebp+8] ;return arr
mov esp,ebp
pop ebp
ret
请记住,这个示例并未真正优化(例如,在整个数组中迭代了太多次)。有时(尤其是汇编语言),少即是多。您可以增加数组指针(或它的副本),而不用ecx / edx偏移指针,并直接使用该指针进行比较。这样,您不必同时跟踪计数器寄存器和指针。 :)