容易回答
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
关于8086的说明总是使用
CX
注册(全部)。
-
你的代码错过了一个无条件跳转到第一个
LOOP AGAIN
以防循环在此终止。这是为了避免在
跳过
程序的一部分。
如何失败
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的第一个
循环再次
不再往后跳。
代码会通过并错误地增加
DL
寄存器。第二
循环再次
同时从
CX
生产
CX=65535
.
所以这个节目很高兴地持续了很长一段时间
但它不会变成一个无限循环
. 因为循环计数器不再是8的倍数
AL
,在某个时刻,它将是第二个
循环再次
这将使
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!!!
因为这是第二次
循环再次
这就不成问题了,因为我们处在程序的最底层。
如果我将最后一位数据更改为1,它将使JC跳过,并且一切正常工作。
这就是代码的作用
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!!!
因为这是第二次
循环再次
这就不成问题了,因为我们处在程序的最底层。