繁体   English   中英

汇编8086,LOOP指令不停止

[英]Assembly 8086, LOOP instruction doesn't stop

以下代码用于程序集8086,我正在使用LOOP指令进行LOOP

CL变为零后,循环将永远继续,并将CX值更改为FFFFh。
但是,如果我将CL的值更改为最大06h,则循环会正确停止。
此外,如果我LOOP AGAIN删除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变为零时停止。 知道为什么它的表现不如预期吗?

UPDATE 1我已经注意到,当CL (或使用16位的CX )达到1并且最后一位为0时,第一个LOOP AGAIN将不会跳转,并且操作将继续到SKIP部分。 如果我将DATA的最后一位更改为1,它将进行JC SKIP ,一切正常。

简单的答案

    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:
  • 8086上的LOOP指令始终使用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,因此“第一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第二个LOOP AGAIN ,所以没有问题,因为我们位于程序的底部。

如果我将DATA的最后一位更改为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!!!

因为LOOP AGAIN第二个LOOP AGAIN ,所以没有问题,因为我们位于程序的底部。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM