汇编程序输出乱码而非输入字符串问题求助(TASM+DosBox)
TASM汇编程序输入字符串显示乱码的排查与解决
问题根源
- 输入缓冲区格式错误:
DOS中断INT 21h的AH=0Ah(字符串输入)功能要求缓冲区结构为:- 第1字节:缓冲区最大容量
- 第2字节:必须初始化为0,由系统填充实际输入的字符数(不含回车)
- 后续字节:存储输入的字符
你的代码将第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
关键修改点
- 修正输入缓冲区的第2字节为
0,让系统正确记录输入长度。 - 添加逻辑将输入字符串末尾的回车替换为
$,确保AH=09h输出时能正确终止。 - 用DOS标准退出指令
AH=4ch+INT 21h替代原代码的ret,避免tiny模式下的返回地址错误。
内容的提问来源于stack exchange,提问作者MURK
相关产品推荐
相关产品推荐

