使用vc ++在asm中冒泡排序问题

时间:2014-11-07 04:26:58

标签: loops visual-c++ assembly masm irvine32

这个程序运行正常,但输出不正确

 INCLUDE Irvine32.inc

 .data
 array BYTE 5,4,3,2,1
 .code
 main PROC
 mov ecx,lengthof array

 l1:
 mov esi,0
 mov eax,0
 l2:
 mov al,array[esi]
 cmp al,array[esi+1]
 jbe noswap

 mov dl,array[esi+1]
 mov array[esi+1],al
 mov array[esi],dl

 noswap:
 add esi,1
 cmp esi,ecx
 jne l2

 loop l1

 mov esi,0
 mov esi,offset array
 mov ecx,lengthof array
 mov ebx,type array 
 call dumpmem

exit
main ENDP
END main

它提供以下输出: 00 01 02 03 04

最后没有显示5。我认为循环中存在问题

1 个答案:

答案 0 :(得分:1)

在您的代码中,ecx将从lengthof array开始(即5),并且将降至1(loop指令不会跳回{当l1变为0时{1}}。这导致内循环出现问题:首先是ecx永远不会变为0,所以你永远不会比较位置0和1的元素;另一个是你在esi的第一次迭代中比较第4和第5位的元素。该数组只有5个元素,因此位置5超过了数组的末尾,因为这些位置是从零开始的。

您应该将l1初始化为ecx。如果MASM不喜欢该语法,请使用(lengthof array)-1并在下一行添加lengthof array。并且dec ecx行应更改为{{1} }后跟loop l1。这样dec ecx将来自jns l1,而不是来自ecx