以下代码用于程序集8086,我正在使用LOOP
指令进行循环。
CL
变为零后,循环将永远继续,并将CX
的值更改为FFFFh。
但是,如果我将CL
的值更改为最大06h,则循环会正确停止。
此外,如果我先删除LOOP AGAIN
,它将正常工作。
DATA DB 01001100b
MOV AL, DATA
MOV CL, 08h
SUB BL, BL
SUB DL, DL
AGAIN:
ROL AL, 1
JC SKIP
INC BL
LOOP AGAIN
SKIP:
INC DL
LOOP AGAIN
我希望它在CL
变为零时停止。知道为什么它的表现不如预期吗?
更新1
我已经注意到,当CL
(或使用16位的CX
达到1且最后一位为0时,第一个LOOP AGAIN
不会跳起来并且操作会继续到跳过部分。如果将 DATA 的最后一位更改为1,它将使JC SKIP
正常运行。
答案 0 :(得分:3)
MOV AL, 01001100b
MOV CX, 0008h
SUB BL, BL
SUB DL, DL
AGAIN:
ROL AL, 1
JC SKIP
INC BL
LOOP AGAIN ; The 1st
JMP ENDOFLOOP
SKIP:
INC DL
LOOP AGAIN ; The 2nd
ENDOFLOOP:
LOOP
指令始终使用CX
寄存器(全部)。LOOP AGAIN
以下的无条件跳转,以防循环应在此处终止。这是为了避免陷入程序的 SKIP 部分。MOV AL, 01001100b MOV CL, 08h SUB BL, BL SUB DL, DL AGAIN: ROL AL, 1 JC SKIP INC BL LOOP AGAIN ; The 1st SKIP: INC DL LOOP AGAIN ; The 2nd
这就是代码的作用(假设CH=0
):
ROL AL, 1 LOOP
AL=01001100b AL=10011000b CF=0 BL=1 CX=7 The 1st jumps back
AL=10011000b AL=00110001b CF=1 DL=1 CX=6 The 2nd jumps back
AL=00110001b AL=01100010b CF=0 BL=2 CX=5 The 1st jumps back
AL=01100010b AL=11000100b CF=0 BL=3 CX=4 The 1st jumps back
AL=11000100b AL=10001001b CF=1 DL=2 CX=3 The 2nd jumps back
AL=10001001b AL=00010011b CF=1 DL=3 CX=2 The 2nd jumps back
AL=00010011b AL=00100110b CF=0 BL=4 CX=1 The 1st jumps back
AL=00100110b AL=01001100b CF=0 BL=5 CX=0 The 1st FALLS THROUGH!!!
此时,由于CX
变为0,因此第一个LOOP AGAIN
不再跳回。
代码通过DL
寄存器并错误地增加了它。第二个LOOP AGAIN
还会从CX
中捏出1个,从而产生CX=65535
。
因此,程序很高兴地持续了很长时间,但它并没有变成无限循环。因为循环计数器不再是8的倍数(AL
中的位数),所以在某个时候它将是第二个LOOP AGAIN
,从而使CX=0
到达程序最终会停止。
但是如果我将CL的值更改为最大06h,则循环会正确停止
这是CX=6
代码的作用:
ROL AL, 1 LOOP
AL=01001100b AL=10011000b CF=0 BL=1 CX=5 The 1st jumps back
AL=10011000b AL=00110001b CF=1 DL=1 CX=4 The 2nd jumps back
AL=00110001b AL=01100010b CF=0 BL=2 CX=3 The 1st jumps back
AL=01100010b AL=11000100b CF=0 BL=3 CX=2 The 1st jumps back
AL=11000100b AL=10001001b CF=1 DL=2 CX=1 The 2nd jumps back
AL=10001001b AL=00010011b CF=1 DL=3 CX=0 The 2nd FALLS THROUGH!!!
因为遇到了第二个LOOP AGAIN
,所以没有问题,因为我们位于程序的底部。
如果我将DATA的最后一位更改为1,它将使JC SKIP正常运行,一切正常
这是AL=01001101b
代码的作用:
ROL AL, 1 LOOP
AL=01001101b AL=10011010b CF=0 BL=1 CX=7 The 1st jumps back
AL=10011010b AL=00110101b CF=1 DL=1 CX=6 The 2nd jumps back
AL=00110101b AL=01101010b CF=0 BL=2 CX=5 The 1st jumps back
AL=01101010b AL=11010100b CF=0 BL=3 CX=4 The 1st jumps back
AL=11010100b AL=10101001b CF=1 DL=2 CX=3 The 2nd jumps back
AL=10101001b AL=01010011b CF=1 DL=3 CX=2 The 2nd jumps back
AL=01010011b AL=10100110b CF=0 BL=4 CX=1 The 1st jumps back
AL=10100110b AL=01001101b CF=1 DL=4 CX=0 The 2nd FALLS THROUGH!!!
因为遇到了第二个LOOP AGAIN
,所以没有问题,因为我们位于程序的底部。