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

TASM代码实现同一输入数字增减:递减功能异常求助

TASM数字递减功能修正方案

问题根源

你的代码存在两个核心问题:

  • 处理递增时直接修改了存储原数字的BL寄存器,后续虽尝试用mov bl,al恢复,但递减后未将数字转回ASCII码,导致输出的是不可见控制字符而非数字字符。
  • 未保留原输入数字的独立副本,寄存器复用逻辑混乱,看似是对递增后的值做递减,实际操作的是原数字但未转码。

修正后的代码

.model small
.stack 200h
.data
mesaj1 db 13,10, "Introduceti un numar: $"
mesaj2 db 13,10, "Numarul incrementat este: $"
mesaj3 db 13,10, "Numarul decrementat este: $"
.code
main proc
    mov ax, @data
    mov ds, ax
    
    ; 显示输入提示
    mov dx, offset mesaj1 
    mov ah,09h
    int 21h
    
    ; 读取输入的ASCII字符
    mov ah,01h            
    int 21h
    
    ; 转换为十进制数字(ASCII码减48)
    sub al,48     
    mov bl,al       ; BL永久保存原输入数字
    mov cl,al       ; CL用于处理递增操作
    
    ; 处理递增并输出
    inc cl          ; 原数字+1
    add cl,48       ; 转回ASCII码
    mov dx, offset mesaj2
    mov ah,09h
    int 21h
    mov dl,cl       
    mov ah,02h
    int 21h
    
    ; 处理递减并输出(直接使用BL中的原数字)
    dec bl          ; 原数字-1
    add bl,48       ; 转回ASCII码
    mov dx, offset mesaj3
    mov ah,09h
    int 21h
    mov dl,bl
    mov ah,02h
    int 21h
    
    ; 退出程序
    mov ah, 4ch
    int 21h
main endp
end main

关键调整说明

  • 用BL专门保存原输入的数字,CL单独处理递增操作,彻底避免原数据被覆盖。
  • 无论递增还是递减,运算后必须加48将数字转回ASCII码,否则DOS中断02h会输出ASCII对应的控制字符而非数字。
  • 简化寄存器复用逻辑,确保每个步骤的数据源清晰,不会出现混淆。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:10:29