如何在TASM中逐字符输出字符串?DOSBox程序问题求助
TASM字符串每行单字符输出问题修复
你的代码存在两个核心问题,对应修复方案如下:
问题1:字符串长度获取错误
INT 21h的0Ah号输入功能要求缓冲区必须遵循固定格式:
- 第1字节:允许输入的最大字符数(不含回车)
- 第2字节:系统自动填充的实际输入字符数(不含回车)
- 第3字节开始:存储输入的字符
你当前的缓冲区定义不符合这个格式,导致无法正确获取实际输入长度。
问题2:单字符输出实现错误
你用09h功能输出,该功能会从DX指向的位置一直输出到$结束,所以每次会输出从当前位置到末尾的所有字符,无法实现单字符输出。应该改用02h功能逐个输出字符。
修改后的完整代码
.model small .data message db 'String: $' ; 0Ah功能缓冲区:10=最大输入长度,?=实际长度占位,10个字符空间 string db 10, ?, 10 dup(' ') .stack 256h .code main: mov ax, @data mov ds, ax ; 输出提示信息 lea dx, message mov ah, 09h int 21h ; 输入字符串(使用0Ah功能) lea dx, string mov ah, 0Ah int 21h ; 换行 mov dl, 10 mov ah, 02h int 21h mov dl, 13 mov ah, 02h int 21h ; 设置循环参数:实际输入长度存于string+1位置 mov cl, string+1 xor ch, ch ; CX = CL,循环次数为实际输入字符数 mov si, 0 ; 字符索引从0开始 output: ; 取单个字符:string[si+2]是第si个输入字符(跳过前两个长度字节) mov dl, string[si+2] mov ah, 02h ; 02h功能:输出DL中的单个字符 int 21h ; 换行 mov dl, 10 mov ah, 02h int 21h mov dl, 13 mov ah, 02h int 21h inc si loop output ; 程序退出 mov ah,4ch int 21h end main
关键改动说明
- 缓冲区修正:重新定义
string为符合0Ah功能的格式,确保能正确获取实际输入长度。 - 循环次数设置:从
string+1读取系统填充的实际输入字符数,作为循环次数,避免输出空行。 - 单字符输出:使用INT 21h的02h功能,每次仅输出DL中的单个字符,实现每行一个字符的需求。
内容的提问来源于stack exchange,提问作者user20299490
相关产品推荐
相关产品推荐

