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

Assembly 80x86 Loop should not loop for ever?

我有以下代码:

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,如果为真则跳转到标签repeta

loop repeta

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

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

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

"Decrements CX by 1 and transfers control to label if CX is not Zero."

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

并且如果 ECXloop 指令之前是 1,那么 loop 指令会将其递减为零并且 不是 跳.