程序集80x86循环不应该永远循环?

时间:2015-01-30 09:41:07

标签: loops assembly x86 x86-16

我有以下代码:

assume cs: code, ds:data
code segment
start:
    mov ax,data
    mov ds, ax

    xor cx,cx
    repeta:
        inc cx
        xor cx,0
        loop repeta

    mov ax, 4Ch
    int 21h

code ends  
end start 

据我所知,它应该循环或直到错误,但实际上它不会。为什么呢?

我怎么想象它有效:

xor cx,cx - cx = 0

输入:repeta代码段

 inc cx  - cx = 1

什么都不做

xor cx,0 - cx is still 1

验证cx是否与0不同,如果为true,则跳转到标签repeta

loop repeta

实际上它没有重复,为什么?

2 个答案:

答案 0 :(得分:3)

循环将在第一次迭代后结束,因为loop指令会将cx减少为零,然后检查它是否为非零。

参考:http://web.itu.edu.tr/kesgin/mul06/intel/instr/loop.html

  

“如果CX不为零,则将CX减少1并将控制转移到标签。”

答案 1 :(得分:1)

根据to thisloop指令会减少ECX并跳转,除非ECX为零。

如果在ECX指令之前1loop,那么loop指令会将其递减为零并且跳转。< / p>