Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 程序集80x86循环不应该永远循环?_Loops_Assembly_X86_X86 16 - Fatal编程技术网

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

Loops 程序集80x86循环不应该永远循环?,loops,assembly,x86,x86-16,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 据我所知,它应该永远循环或直到出错,但实际上它并没有。为什么? 我

我有以下代码:

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
code段

 inc cx  - cx = 1
无所事事

xor cx,0 - cx is still 1
验证
cx
是否与0不同,如果为真,则跳转到标签
repeta

loop repeta

实际上它不会重复,为什么?

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

参考:

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


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

参考:

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

根据,循环指令减少ECX,除非ECX为零,否则将跳转

如果
ECX
loop
指令之前是
1
,那么
loop
指令将把它减为零,而不是跳转。

相应地,
loop
指令减小
ECX
并跳转,除非
ECX
为零

如果
ECX
loop
指令之前是
1
,则
loop
指令将其递减为零,而不是跳转