在汇编语言 x86 中从最大到最小对数组进行排序
Sorting an array from biggest to least in Assembly language x86
我正在尝试使用寄存器从大到小对数组进行排序,但似乎没有任何效果。 ecx 是我拥有的数字数量,esi 是我的列表地址,它由双字组成。我使用 edx 为每个元素增加 4 个字节。我的代码没有对整个数组进行排序我知道我需要找到最大值的位置然后将其设置为等于外部循环 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
您要查找的是 'reversed' Bubble Sort(您当然可以使用任何您希望的排序算法,但这对于示例来说很简单)。我不确定你使用的是什么汇编程序,但这里有一个简短的汇编函数,它将完成一种存储在 array/list arr
中的 n
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,然后直接使用它进行比较。这样您就不必同时跟踪计数器寄存器和指针。 :)
我正在尝试使用寄存器从大到小对数组进行排序,但似乎没有任何效果。 ecx 是我拥有的数字数量,esi 是我的列表地址,它由双字组成。我使用 edx 为每个元素增加 4 个字节。我的代码没有对整个数组进行排序我知道我需要找到最大值的位置然后将其设置为等于外部循环 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
您要查找的是 'reversed' Bubble Sort(您当然可以使用任何您希望的排序算法,但这对于示例来说很简单)。我不确定你使用的是什么汇编程序,但这里有一个简短的汇编函数,它将完成一种存储在 array/list arr
中的 n
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,然后直接使用它进行比较。这样您就不必同时跟踪计数器寄存器和指针。 :)