代码之家  ›  专栏  ›  技术社区  ›  Nawras

程序集8086,循环指令不停止

  •  2
  • Nawras  · 技术社区  · 7 年前

    下面的代码用于程序集8086,我使用 LOOP 指令。

    这个循环会一直持续下去 CL 变为零,它改变了 CX 值为FFFH。
    但是如果我改变 氯 至最大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
    

    我希望它在什么时候停止 氯 变为零。你知道为什么它不能像预期的那样运行吗?

    更新1 我注意到什么时候 氯 (或) CX 当使用16位时)达到1,最后一位为0,然后第一位 循环再次 不会跳起来,操作继续 跳过 部分。如果我改变了 数据 它将使 JC SKIP 一切都很好。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Sep Roland    7 年前

    容易回答

        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!!!
    

    因为这是第二次 循环再次 这就不成问题了,因为我们处在程序的最底层。

    推荐文章