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

8086汇编:有符号单数字十进制数输入输出代码Msg3输出错误求助

8086汇编:有符号单数字输入输出的Msg3显示异常问题

我写了一段处理有符号单数字十进制数输入输出的8086汇编代码,但Msg3的输出不符合预期——本该显示输入的数字并判断其正负,试了好几种修改方法都没解决。

以下是我的代码:

.model small
.stack 100h

.data
    Msg1 DB 'Enter first number: $'
    Msg2 DB 10, 13, 'Enter second number: $'
    Msg3 DB 10, 13, 'Entered numbers are: $'
    PositiveMsg DB ' is positive$'
    NegativeMsg DB ' is negative$'
    InputBuffer DB 6 DUP('$')

.code
main proc
    mov ax, @data
    mov ds, ax

    ; 显示请求输入第一个数字的提示信息
    mov ah, 09h
    lea dx, Msg1
    int 21h

    ; 读取用户输入的第一个数字
    mov ah, 01h
    int 21h
    sub al, '0'          ; 将ASCII字符转换为对应的数值
    mov bh, al           ; 将第一个数字的数值移至BH寄存器

    ; 判断第一个数字是正数还是负数
    cmp al, 0
    jge FirstPositive
    mov dx, OFFSET NegativeMsg  ; 显示第一个数字的负数提示信息
    int 21h
    neg bh               ; 取反数值使其变为正数
    jmp CheckSecondNumber
FirstPositive:
    mov dx, OFFSET PositiveMsg  ; 显示第一个数字的正数提示信息
    int 21h

CheckSecondNumber:
    ; 显示请求输入第二个数字的提示信息
    mov ah, 09h
    lea dx, Msg2
    int 21h

    ; 读取用户输入的第二个数字
    mov ah, 01h
    int 21h
    sub al, '0'          ; 将ASCII字符转换为对应的数值
    mov dh, al           ; 将第二个数字的数值移至DH寄存器

    ; 判断第二个数字是正数还是负数
    cmp al, 0
    jge SecondPositive
    mov dx, OFFSET NegativeMsg  ; 显示第二个数字的负数提示信息
    int 21h
    neg dh               ; 取反数值使其变为正数
    jmp DisplayNumbers
SecondPositive:
    mov dx, OFFSET PositiveMsg  ; 显示第二个数字的正数提示信息
    int 21h

DisplayNumbers:
    ; 显示提示信息表明已输入的数字
    mov ah, 09h
    lea dx, Msg3
    int 21h

    ; 显示第一个输入的数字
    mov dl, bh           ; 将第一个数字的数值移至DL寄存器
    add dl, '0'          ; 将数值转换为对应的ASCII字符
    mov ah, 02h
    int 21h

    ; 显示第一个数字的正负提示信息
    mov dx, OFFSET PositiveMsg
    int 21h

    ; 在数字之间显示逗号
    mov dl, ','         
    int 21h

    ; 显示第二个输入的数字
    mov dl, dh           ; 将第二个数字的数值移至DL寄存器
    add dl, '0'          ; 将数值转换为对应的ASCII字符
    mov ah, 02h
    int 21h

    ; 显示第二个数字的正负提示信息
    mov dx, OFFSET PositiveMsg
    int 21h

    ; 退出程序
    mov ah, 4Ch
    int 21h
main endp

end main

当前Msg3的输出错误,预期应显示输入的数字并判断其正负,错误输出截图:
错误输出截图


问题分析

  • 输入处理逻辑错误:使用int 21h的01h功能读取输入时,若输入负号(-),直接转数值会得到负数,但后续取反操作丢失了原始符号信息,导致最终显示时无法还原负号。
  • Display阶段符号提示硬编码:不管输入数字的实际正负,DisplayNumbers段都固定调用PositiveMsg,完全忽略了之前的符号判断结果。
  • 负数输入流程缺失:当前代码只读取单个字符,无法正确处理“负号+数字”的输入格式,比如输入-3只会读取-字符,后续逻辑混乱。

修复后的代码

.model small
.stack 100h

.data
    Msg1 DB 'Enter first number: $'
    Msg2 DB 10, 13, 'Enter second number: $'
    Msg3 DB 10, 13, 'Entered numbers are: $'
    PositiveMsg DB ' is positive$'
    NegativeMsg DB ' is negative$'
    MinusSign DB '-'

.code
main proc
    mov ax, @data
    mov ds, ax

    ; 处理第一个数字输入
    mov ah, 09h
    lea dx, Msg1
    int 21h

    mov bl, 0           ; bl保存第一个数字的符号:0=正,1=负
    mov ah, 01h
    int 21h
    cmp al, '-'
    jne FirstNoMinus
    mov bl, 1           ; 标记为负数
    int 21h             ; 读取负号后的数字
FirstNoMinus:
    sub al, '0'
    mov bh, al          ; bh保存第一个数字的绝对值

    ; 处理第二个数字输入
    mov ah, 09h
    lea dx, Msg2
    int 21h

    mov dl, 0           ; dl保存第二个数字的符号:0=正,1=负
    mov ah, 01h
    int 21h
    cmp al, '-'
    jne SecondNoMinus
    mov dl, 1           ; 标记为负数
    int 21h             ; 读取负号后的数字
SecondNoMinus:
    sub al, '0'
    mov dh, al          ; dh保存第二个数字的绝对值

DisplayNumbers:
    mov ah, 09h
    lea dx, Msg3
    int 21h

    ; 显示第一个数字
    cmp bl, 1
    jne FirstPos
    mov ah, 02h
    mov dl, MinusSign
    int 21h
FirstPos:
    mov dl, bh
    add dl, '0'
    mov ah, 02h
    int 21h
    ; 显示第一个数字的正负描述
    mov ah, 09h
    cmp bl, 1
    je FirstNegMsg
    lea dx, PositiveMsg
    int 21h
    jmp ShowComma
FirstNegMsg:
    lea dx, NegativeMsg
    int 21h

ShowComma:
    mov ah, 02h
    mov dl, ','
    int 21h
    mov dl, ' '         ; 加空格优化输出格式
    int 21h

    ; 显示第二个数字
    cmp dl, 1
    jne SecondPos
    mov ah, 02h
    mov dl, MinusSign
    int 21h
SecondPos:
    mov dl, dh
    add dl, '0'
    mov ah, 02h
    int 21h
    ; 显示第二个数字的正负描述
    mov ah, 09h
    cmp dl, 1
    je SecondNegMsg
    lea dx, PositiveMsg
    int 21h
    jmp ExitProg
SecondNegMsg:
    lea dx, NegativeMsg
    int 21h

ExitProg:
    mov ah, 4Ch
    int 21h
main endp

end main

修复要点

  • 新增符号标记寄存器,单独保存每个数字的正负状态(bl存第一个数符号,dl存第二个数符号)
  • 完善负数输入逻辑:先判断是否输入负号,再读取后续的数字字符
  • 在Display阶段根据符号标记,决定是否显示负号以及调用对应的正负提示信息
  • 补充数字间的空格,优化输出可读性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:05:56