TASM整数数组均值计算程序无控制台输出问题求助
问题排查与修复:TASM数组均值程序无输出的原因
我来帮你拆解下这个程序的核心问题,正是这些问题导致控制台没有任何输出:
1. 除法指令使用错误引发程序异常终止
你用了idiv bx来计算均值,但这里有个关键细节:当idiv的操作数是16位寄存器(比如bx)时,CPU会把DX:AX作为32位被除数处理,可你完全没初始化DX寄存器,它里面是随机的垃圾值。这会直接导致两种后果:要么算出完全错误的商,要么触发除法溢出异常,程序直接崩溃,根本走不到后面的打印逻辑。
解决办法很简单:你的累加和(45)与除数(9)都在8位范围内,改用8位除法指令div bl就足够了。div bl会把AX作为被除数(AH已经是0,因为你之前用al累加,ax高8位没改动),商存在AL,余数在AH,完全匹配你的需求。
2. 输出时未将数值转换为ASCII字符
就算程序走到打印步骤,直接把均值(比如5)放到DL里调用INT 21H 02H也看不到输出——DOS的这个功能是输出ASCII字符,而数值5对应的ASCII是不可见的控制字符,不是我们要的数字'5'。
解决办法:给DL里的数值加上30H,转换成对应的ASCII数字字符,比如add dl, 30h,这样就能正确打印出数字了。
可选优化:用自动计算的数组长度代替硬编码
你已经在DATA段定义了lng db $-sir来自动计算数组长度,但程序里还是硬编码了mov cx,9,改成mov cl, lng会更灵活,以后修改数组元素时不用手动调整循环次数。
修正后的完整代码
DATA SEGMENT PARA PUBLIC 'DATA' msg db "The average is:", "$" sir db 1,2,3,4,5,6,7,8,9 lng db $-sir ; 自动计算数组长度 DATA ENDS CODE SEGMENT PARA PUBLIC 'CODE' MAIN PROC FAR ASSUME CS:CODE, DS:DATA PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX ;初始化部分到此结束 mov cl, lng ; 使用自动计算的长度,代替硬编码的9 mov ch, 0 ; 把CX的高8位清零,确保循环次数正确 mov ax, 0 mov bx, 0 sum: add al, sir[bx] inc bx loop sum div bl ; 8位除法,被除数是AX(AH=0),商存在AL ;打印部分从此开始,先输出文本 MOV AH, 09H LEA DX, msg INT 21H mov ah, 02h mov dl, al add dl, 30h ; 转换为ASCII字符 int 21h ret MAIN ENDP CODE ENDS END MAIN
改成这样编译运行后,就能看到正确输出:The average is:5了。
内容的提问来源于stack exchange,提问作者mihaicata1205
相关产品推荐
相关产品推荐

