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

汇编程序输出乱码而非输入字符串问题求助(TASM+DosBox)

TASM汇编程序输入字符串显示乱码的排查与解决

问题根源

  • 输入缓冲区格式错误:
    DOS中断INT 21h的AH=0Ah(字符串输入)功能要求缓冲区结构为:
    1. 第1字节:缓冲区最大容量
    2. 第2字节:必须初始化为0,由系统填充实际输入的字符数(不含回车)
    3. 后续字节:存储输入的字符
      你的代码将第2字节初始化为255,导致系统无法正确记录输入长度,破坏了后续输出逻辑。
  • 缺少输出结束符:
    AH=0Ah输入的字符串末尾是回车符(0Dh),而AH=09h(字符串输出)功能需要以$作为结束标记。直接输出会遍历内存直到找到$,期间会输出随机乱码。

修正后的代码

model tiny  
.code  
.startup  
    ; 读取用户输入
    mov dx, offset tm  
    mov ah, 0ah  
    int 21h  

    ; 将输入末尾的回车替换为$结束符
    mov bl, tm+1       ; 获取实际输入的字符数(不含回车)
    mov bh, 0
    mov tm[bx+2], '$'  ; 在输入字符串末尾写入$

    ; 输出提示文本
    mov dx, offset testm  
    mov ah, 09h  
    int 21h  

    ; 输出用户输入的字符串
    mov dx, offset tm+2  
    mov ah, 09h  
    int 21h  

    ; 标准DOS程序退出
    mov ah, 4ch
    int 21h

; 输入缓冲区:第1字节最大容量,第2字节初始为0,后续存输入字符
tm db 255, 0, 255 dup ("$")  
testm db "Entered string: $"  
End  

关键修改点

  1. 修正输入缓冲区的第2字节为0,让系统正确记录输入长度。
  2. 添加逻辑将输入字符串末尾的回车替换为$,确保AH=09h输出时能正确终止。
  3. 用DOS标准退出指令AH=4ch+INT 21h替代原代码的ret,避免tiny模式下的返回地址错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:03:26