8086汇编LOOP指令无法终止问题技术求助
8086汇编LOOP指令导致无限循环的问题解析
你遇到的问题核心是对LOOP指令的执行逻辑理解有偏差,咱们一步步拆解清楚:
先明确LOOP指令的核心逻辑
LOOP指令的操作顺序是先将CX寄存器的值减1,再判断CX是否为0:
- 如果CX减1后不等于0,跳转到目标标签;
- 如果CX减1后等于0,不跳转,继续执行下一条指令。
这和“先判断CX是否为0,再减1”的直觉逻辑完全不同,这是踩坑的关键!
你的代码问题分析
看你的代码流程,初始CX=08h(十进制8),DATA=01001100b(二进制,最后几位为0):
- 多次循环后,当
CX=01h时进入AGAIN标签:- 执行
ROL AL,1后CF=0(当前AL的最高位为0),所以JC SKIP不跳转; - 执行
INC BL,然后触发第一条LOOP AGAIN:- CX先减1,变成
00h; - 此时CX等于0,所以不跳转,继续执行后面的
SKIP标签代码。
- CX先减1,变成
- 执行
- 进入
SKIP后执行INC DL,然后触发第二条LOOP AGAIN:- 此时CX是
00h,LOOP指令先把CX减1,变成FFFFh; - 因为
FFFFh≠0,所以跳转到AGAIN标签; - 之后每次执行
LOOP都会把CX从FFFFh继续递减,永远不会回到0(要减65536次才会到0,相当于无限循环)。
- 此时CX是
为什么CL=06h时正常?
当CL=06h时,循环次数更少,在第一条LOOP把CX减到0之前,某次ROL AL,1会让CF=1(触发JC SKIP),此时进入SKIP后执行第二条LOOP:
- 假设此时CX减1后刚好等于0,LOOP指令判断后不跳转,程序正常终止;
- 简单说就是循环次数少,还没到CX被第一条LOOP减到0的情况,就已经触发了SKIP分支,最终第二条LOOP能正常把CX减到0并结束。
为什么移除第一条LOOP后正常?
移除第一条LOOP AGAIN后,每次执行完AGAIN的代码(不管CF是0还是1),最终都会走到SKIP里的LOOP AGAIN:
- 每次LOOP只执行一次,CX稳步递减,直到CX减到0时,LOOP指令判断后不跳转,程序正常结束;
- 不存在“CX已经为0后再被LOOP减1变成FFFFh”的情况,自然不会无限循环。
解决方法
要实现“CL为0时循环终止”的需求,你需要调整循环逻辑,避免出现CX为0后再执行LOOP的情况。比如把两个LOOP合并,统一控制循环:
DATA DB 01001100b MOV AL, DATA MOV CL, 08h SUB BL, BL SUB DL, DL AGAIN: ROL AL, 1 JC SKIP INC BL JMP CONTINUE ; 跳过SKIP部分,直接到循环控制 SKIP: INC DL CONTINUE: LOOP AGAIN ; 统一在这里做循环控制
这样每次循环都只执行一次LOOP,CX会从08h稳步减到0,不会出现变成FFFFh的情况,循环能正常终止。
内容的提问来源于stack exchange,提问作者Nawras
相关产品推荐
相关产品推荐

