You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键修正说明

  1. 输入转换修正:把add al,48h改成sub al,48h,将输入的ASCII字符(比如'3'=33h)转换成对应的数值3,这是正确的字符转数值逻辑。
  2. 栈操作与差值计算修正:明确弹出顺序,先弹第二个数存入bx,再弹第一个数,用sub ax,bx得到第一个数 - 第二个数的结果(如果需要计算第二个数 - 第一个数,改成sub bx,ax即可)。
  3. 输出转换修正:计算完成后,把数值结果加48h转成ASCII码,再调用int 21h(AH=2)输出,这样就能显示正确的数字字符。
  4. 补充交互与退出逻辑:添加了输入提示让程序更友好,补上了ah=4ch int 21h的退出调用,避免程序运行后出现异常。

如果需要支持负数差值或者多位数输入输出,还可以进一步扩展逻辑,但以上修正已经能解决你当前的核心问题——输出正确的数值结果。

内容的提问来源于stack exchange,提问作者developer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:08:31