x86汇编jnz指令疑问:dx非0时循环为何持续执行?
循环未终止的原因分析
核心误解:jnz指令的逻辑搞反了
你对jnz指令的对应逻辑理解错误——jnz是「Jump if Not Zero」(零标志位ZF=0时跳转),对应的C语言逻辑是if (dx != 0),而不是if (x == y)。这是导致你困惑的根本原因。
代码里的拼写错误
代码中的moc bx, 10是笔误,正确指令应为mov bx, 10,如果不修正这个错误,程序会因无效指令直接异常终止,以下分析基于修正后的代码展开。
循环执行的实际流程
初始状态:ax=1024,cx=0,bx=10
- 进入
wh循环:- 先将
dx置0,执行div bx(被除数是dx:ax即0*65536+1024=1024,除数是bx=10) - 1024 ÷10,商102存入
ax,余数4存入dx cx自增为1,执行cmp dx, 0——dx=4≠0,零标志位ZF=0- 触发
jnz wh,跳回循环开头继续执行(这是符合jnz逻辑的,因为此时dx≠0)
- 先将
- 第二次循环:
dx被置0,被除数变为0*65536+102=102,除以10后商10存ax,余数2存dxcx自增为2,cmp dx,0后ZF=0,再次触发jnz跳转
- 第三次循环:
dx置0,被除数是0*65536+10=10,除以10后商1存ax,余数0存dxcx自增为3,cmp dx,0后ZF=1,jnz不触发,循环终止
你看到的「dx=4时循环继续」是完全正常的,因为jnz的作用就是当dx不等于0时回到循环开头。如果你的需求是dx≠0时终止循环,那应该把jnz wh换成jz wh(Jump if Zero,当ZF=1时跳转)。
内容的提问来源于stack exchange,提问作者xyzunknown
相关产品推荐
相关产品推荐

