[英]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:
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.