我有一个由15个随机整数组成的dword数组,存储在esi中。我有一个冒泡排序算法,下面应该排列从最低到最高的值。但是当我的程序运行这个算法时,它似乎没有触及任何值,当我打印数组时,它就像以前一样。想法?
BubbleSort PROC USES eax ebx ecx edx esi
mov ecx, 0
mov ecx, 15
OUTER_LOOP:
push ecx
mov ecx,0
mov ecx,14
mov esi, OFFSET arr
COMPARE:
mov ebx,0
mov edx,0
mov bl, [esi]
mov dl, [esi+1]
cmp bl,dl
jg SWAP
CONTINUE:
add esi,4
loop COMPARE
mov esi, OFFSET arr
pop ecx
loop OUTER_LOOP
jmp FINISHED
SWAP:
mov bl, [esi]
mov dl, [esi+1]
xchg bl,dl
mov [esi],dl
mov [esi+1],bl
jmp CONTINUE
FINISHED:
ret
BubbleSort ENDP
提前感谢您的帮助。
答案 0 :(得分:1)
编辑:
我在您的代码中发现了不同的问题。我已将它们修复到下面并且ESI实际上已更改(未排序因为我认为排序算法错误但没有时间更改它)
1- mov reg,0
最好是对寄存器进行xor而不是向它移动0。 XOR指令更短。
2-在CONTINUE循环中我使用add esi,2(也许你在64位窗口?)
3-在SWAP循环中,前2个mov指令无用。我删除了它们。
4-在SWAP循环中,您需要交换将值放回到esi和esi + 1中的行(实际上您甚至不需要xchg指令。)
现在ESI改变了。您需要处理排序算法。
BubbleSort PROC uses ECX
xor ecx,ecx
mov ecx, 15
OUTER_LOOP:
push ecx
xor ecx,ecx
mov ecx,14
mov esi, OFFSET arr
COMPARE:
xor ebx,ebx
xor edx,edx
mov bl, byte ptr ds:[esi]
mov dl, byte ptr ds:[esi+1]
cmp bl,dl
jg SWAP
CONTINUE:
add esi,2
loop COMPARE
mov esi, OFFSET arr
pop ecx
loop OUTER_LOOP
jmp FINISHED
SWAP:
xchg bl,dl
mov byte ptr ds:[esi+1],dl
mov byte ptr ds:[esi],bl
jmp CONTINUE
FINISHED:
ret
BubbleSort ENDP
编辑: 在外部循环中,您有2个 mov esi,OFFSET arr
第二个就在退出之前发生。所以你基本上把数组偏移量放回到ESI中,就像它在开始时一样。
下面的USES ESI说明成立。你需要删除它。
ECX在此程序中使用的是什么?它从未使用过,但是您要分配值,pushig并弹出它们?
使用eax ebx ecx edx esi
这个masm助手将ESI推入堆栈。
退出程序时,它会像之前一样弹出。
所以你可能不想在那里加入ESI。
注意,您还希望将DWORD放在另一个寄存器中,如EAX。在某些情况下进入程序ESI时,无论如何都会推送喜欢的程序。