EMU 8086汇编程序减法结果输出异常问题求助
问题分析与解决方案
你的程序输出字符而非正确数值,核心问题出在ASCII码与数值的转换逻辑错误,以及栈操作后的差值计算顺序问题。咱们一步步来修正:
主要问题点
- 输入转换完全搞反:用
int 21h(AH=1)读取输入时,返回的是字符的ASCII码(比如输入数字'5'得到的是35h),你现在写的add al, 48h会把ASCII码往更大的字符值转,完全错了——应该用sub al, 48h把ASCII码转换成对应的十进制数值。 - 栈顺序导致差值计算错误:栈是"后进先出"结构,你先输入的第一个数会被压到栈底,第二个数在栈顶。所以
pop的时候先取出的是第二个数,再取出第一个数。你当前的sub bx, ax逻辑会算出0 - 第二个数 - 第一个数,这显然不是你要的两数差值。 - 输出转换有局限性:当前直接对
bl减48h,只适用于差值是0-9的正数,如果差值是负数或者大于9的数会出错,不过先解决基础问题。
修正后的完整代码
.MODEL SMALL .STACK 100H .DATA msg1 db 'Enter first number: $' msg2 db 0dh,0ah, 'Enter second number: $' msg3 db 0dh,0ah, 'Result: $' .CODE MAIN PROC mov ax,@data mov ds,ax ; 提示输入第一个数 mov ah,9 lea dx,msg1 int 21h ; 读取第一个数并转成数值 mov ah,1 int 21h sub al,48h ; ASCII字符转十进制数值 push ax ; 压入栈保存 ; 提示输入第二个数 mov ah,9 lea dx,msg2 int 21h ; 读取第二个数并转成数值 mov ah,1 int 21h sub al,48h ; ASCII字符转十进制数值 push ax ; 压入栈保存 ; 显示结果提示 mov ah,9 lea dx,msg3 int 21h ; 计算差值:第一个数 - 第二个数 xor bx,bx pop ax ; 先取出栈顶的第二个数 mov bx,ax pop ax ; 再取出栈底的第一个数 sub ax,bx ; ax = 第一个数 - 第二个数 mov bx,ax ; 数值转ASCII并输出 add bl,48h ; 十进制数值转ASCII字符 mov ah,2 mov dl,bl int 21h ; 程序正常退出 mov ah,4ch int 21h MAIN ENDP END MAIN
关键修正说明
- 输入转换修正:把
add al,48h改成sub al,48h,将输入的ASCII字符(比如'3'=33h)转换成对应的数值3,这是正确的字符转数值逻辑。 - 栈操作与差值计算修正:明确弹出顺序,先弹第二个数存入bx,再弹第一个数,用
sub ax,bx得到第一个数 - 第二个数的结果(如果需要计算第二个数 - 第一个数,改成sub bx,ax即可)。 - 输出转换修正:计算完成后,把数值结果加48h转成ASCII码,再调用
int 21h(AH=2)输出,这样就能显示正确的数字字符。 - 补充交互与退出逻辑:添加了输入提示让程序更友好,补上了
ah=4ch int 21h的退出调用,避免程序运行后出现异常。
如果需要支持负数差值或者多位数输入输出,还可以进一步扩展逻辑,但以上修正已经能解决你当前的核心问题——输出正确的数值结果。
内容的提问来源于stack exchange,提问作者developer
相关产品推荐
相关产品推荐

