循环使用DEC

时间:2014-03-11 18:21:17

标签: assembly masm cpu-registers masm32

我遇到MASM32程序的问题。我试图让这段代码起作用:

.DATA
alfa dword 9

.CODE
start:

MOV ecx, alfa
MOV eax, 0

L1: ADD eax, ecx
DEC ecx
LOOP L1
CALL WRITEINT

exit
END start

我发现问题只在循环内,其他一切正常。有些人可以帮助我让循环正常工作,它不返回值而不退出。这应该发生吗?提前谢谢大家!

2 个答案:

答案 0 :(得分:2)

您正在减少ecx两次。 dec指令会减少它,loop指令也会减少它。

使用

dec ecx
jne L1

或使用

loop L1

它不退出的原因如下

dec ecx ->  ecx = 8
loop l1 -> ecx = 7
dec ecx ->  ecx = 6
loop l1 -> ecx = 5
dec ecx ->  ecx = 4
loop l1 -> ecx = 3
dec ecx ->  ecx = 2
loop l1 -> ecx = 1

这就是抓住了!

dec ecx ->  ecx = 0   no condition
loop l1 -> ecx = 0xffffffff Loop will not break because it breaks on 0
dec ecx -> ecx = 0xfffffffe
loop l1 -> ecx = 0xfffffffd
...

......等等。你明白了。如果您使用过调试器,那么只需几次迭代就可以看到它。

实际上,此次往返中ecx将达到0,但 LONG 时间。 :)

答案 1 :(得分:1)

LOOP已经处理了减量,所以摆脱DEC ECX,即改变:

DEC ecx
LOOP L1

只是:

LOOP L1