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
相关产品推荐
相关产品推荐

