这个程序运行正常,但输出不正确
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。我认为循环中存在问题
答案 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
。