0-9范围内质数检测汇编程序故障排查求助
汇编质数检测程序错误排查与修正
你的程序核心逻辑思路正确,但存在几个关键错误导致输出异常或崩溃,以下是具体问题和修复方案:
问题分析
- 特殊值(0、1)未处理:根据质数定义,0和1都不是质数,但当前程序处理这两个值时会触发除数为0的错误(输入1时,
DIV CL(CL=2)得到商0,CL被设为0,后续循环中DIV CL会引发除法错误;输入0时同理),或者错误判定为质数。 - 符号拼写错误:
LBL3段中OFFSETNL3应为OFFSET NL3,缺少空格会导致汇编器无法正确解析OFFSET运算符,进而引用错误的内存地址,输出乱码或无输出。 - 循环终止条件逻辑瑕疵:当输入的数为2时程序能正确判定,但循环起始的商计算逻辑在处理小数值时,缺少对质数定义的前置判断(大于1)。
修复步骤
- 添加0和1的前置判断:在进入循环前,先检查输入值是否小于2,若是直接判定为非质数。
- 修正符号拼写错误:把
OFFSETNL3改为OFFSET NL3。 - 优化循环起始逻辑:确保循环从
n//2开始递减,同时避免除数为0的情况。
修正后的代码
.MODEL SMALL .DATA VAL1 DB ? NL1 DB 0AH,0DH,'ENTER NO:','$' NL2 DB 0AH,0DH,'IT IS NOT PRIME','$' NL3 DB 0AH,0DH,'IT IS PRIME','$' .CODE ORG 0100H MAIN: MOV AX,@DATA MOV DS,AX MOV DX,OFFSET NL1 MOV AH,09H INT 21H MOV AH,01H INT 21H SUB AL,30H MOV VAL1,AL ; 处理0和1的特殊情况 CMP AL,2 JB LBL2 ; 小于2直接判定非质数 MOV AH,00 MOV CL,2 DIV CL MOV CL,AL LBL1: MOV AH,00 MOV AL,VAL1 DIV CL CMP AH,00 JZ LBL2 ; 能整除则非质数 DEC CL CMP CL,1 JNE LBL1 JMP LBL3 ; 循环结束未找到因数,判定为质数 LBL2: MOV AH,09H MOV DX,OFFSET NL2 INT 21H JMP EXIT LBL3: MOV AH,09H MOV DX, OFFSET NL3 ; 修正拼写错误 INT 21H EXIT: MOV AH,4CH INT 21H END MAIN
额外说明
- 修正后的程序会先过滤0和1这两个非质数,避免后续的除数为0错误。
- 对于2-9的数值,循环从
n//2开始向下检查因数,符合质数判定的优化逻辑(只需检查到平方根以下的数,这里n//2等价于平方根范围,因为n≤9)。
内容的提问来源于stack exchange,提问作者Mike Taslakjian
相关产品推荐
相关产品推荐

