【问题标题】:Assembly language: counter loop汇编语言:计数器循环
【发布时间】:2016-11-07 02:51:10
【问题描述】:

我编写了一个汇编代码,其中包括:

    XOR BL,BL
    MOV CX,0 
TOP: 
    INC BL,1
    MOV AH,2 
    MOV DL, BL 
    INT 21H
    LOOP TOP

循环执行的次数非常多(肯定超过 10,000 次)。如此长时间的循环执行背后的可能原因是什么?我对汇编语言非常陌生,发现与 CX=0 相关的代码没有任何效率。提前致谢。

【问题讨论】:

  • 在调试器中单步执行代码并观察寄存器会发现这一点。在第一次迭代后你会看到 CX=0xFFFF,这会提示你去手册中查找它并发现它在递减之前没有检查。

标签: assembly counter x86-16


【解决方案1】:

您的计数器cx 未正确初始化。指令loop 做了两件事:

dec cx            ;◄■■■ DECREASE THE COUNTER.
jnz label         ;◄■■■ IF COUNTER IS NOT ZERO, JUMP TO LABEL TO REPEAT.

在您的代码中,计数器cx 被初始化为零,因此,当loop 指令执行时,它执行cx - 1,即0 - 1,因此cx 变为0ffffh,您的循环将重复0ffffh 次。

将另一个值移动到您的计数器 cx,例如 mov cx, 10,这样您的循环将重复 10 次。

【讨论】:

  • 感谢乔斯的详细解释
【解决方案2】:

Intel loop 指令首先递减 CX 寄存器,然后检查零条件。

TOP: 测试之前将 CX 设置为 1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多