单数字素数判断汇编代码问题:输入9误判为素数求解析
问题分析:输入9时
jz end未触发的原因 你的代码核心问题是循环中执行除法前没有重置被除数ax为原始数字,导致后续除法计算使用了错误的被除数,余数始终不为0,jz end无法触发。
输入9的错误执行流程拆解
- 输入9后,程序将ASCII码转为数字9,存入
dx和ax,初始化bl=2。 - 首次除法
div bl:9÷2得到商4、余数1,随后设置循环次数cl=4,重置ax=9,dec cl后循环次数为3。 - 进入循环
l1:- 第一次循环:
div bl(bl=2),此时ax仍是9,余数1≠0,bl自增到3,循环次数减为2,继续循环。 - 第二次循环:未重置ax,此时ax是上一次除法的结果(商4+余数1,即ax=0x0104=260)。用260÷3得到余数2≠0,
bl自增到4,循环次数减为1,继续循环。 - 第三次循环:ax还是260,260÷4余数2≠0,
bl自增到5,循环次数减为0,循环结束。
- 第一次循环:
- 循环结束后执行素数输出逻辑,导致9被误判为素数。
修复方法
在循环标签l1后,先将ax重置为存储原始数字的dx,再执行除法:
l1:mov ax, dx ; 每次循环前重置ax为原始数字 div bl cmp ah,00h jz end inc bl dec cl jnz l1
修改后,每次循环都会用原始数字9除以当前的bl:当bl=3时,9÷3余数为0,cmp ah,0成立,触发jz end,跳去输出“Number is not prime”,符合预期。
内容的提问来源于stack exchange,提问作者Fury
相关产品推荐
相关产品推荐

