簡體   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