【问题标题】:Looping with a DEC使用 DEC 循环
【发布时间】:2014-03-11 18:21:17
【问题描述】:

我遇到了 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

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

【问题讨论】:

    标签: assembly masm cpu-registers masm32


    【解决方案1】:

    您正在减少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时间。 :)

    【讨论】:

    • 感谢您的解释,我是新手,刚刚开始,非常感谢您的帮助,我不知道 LOOP 指令会自动递减!
    • 我建议下载英特尔使用手册。这是一种非常宝贵的资源。并尝试使用调试器。无论如何,您将非常需要它,并且当您修改内存中的代码时,您可以在没有组装周期的情况下试验指令。
    【解决方案2】:

    LOOP 已经处理了减量,所以去掉DEC ECX,即更改:

    DEC ecx
    LOOP L1
    

    只是:

    LOOP L1
    

    【讨论】:

    • 感谢您的回答!我还需要知道原因,但我现在看到我使用 DEC 和 LOOP 指令递减了两次。
    猜你喜欢
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    相关资源
    最近更新 更多