调用DOS输入输出字符串接口时无法获取完整缓冲区内容的问题排查
问题修复说明
核心错误点
- 对
int 21h 0Ah的缓冲区结构理解错误:该中断输入的缓冲区前2个字节为控制字段,第3个字节开始才是用户输入的有效字符,你当前的转移逻辑直接从缓冲区首地址开始搬运,同时也没有跳过目标缓冲区result的前2个控制字段。 - 循环相关寄存器未初始化:
loop指令依赖cx寄存器控制循环次数,si/di需要分别指向源、目标缓冲区的有效数据起始地址,你的代码中这三个寄存器都没有正确赋值,循环次数完全随机,自然无法搬运完整内容。 - 输出参数设置错误:调用
int 21h 40h输出时,你传入的起始地址是result的首地址(对应控制字段,为不可见字符),而非有效内容的起始地址result+2,且输出长度读取的result+1字段未被正确赋值,长度错误进一步导致输出内容缺失。
修复后的核心代码示例
首先补充转移逻辑的初始化部分:
; 新增寄存器初始化代码 mov si, offset buff + 2 ; 指向输入缓冲区第一个有效字符 mov di, offset result + 2 ; 指向结果缓冲区第一个有效存储位 xor cx, cx mov cl, [buff + 1] ; 取实际输入的字符数作为循环次数 mov [result + 1], cl ; 给结果缓冲区的长度字段赋值 loop_transfer: mov al, [si] ; 搬运字节用8位寄存器al即可,无需使用ah mov [di], al inc si inc di loop loop_transfer
修正后的输出逻辑:
mov ah, 09h mov dx, offset _result int 21h mov ah, 40h mov bx, 1 xor cx, cx mov cl, [result + 1] ; 取实际要输出的字符长度 mov dx, offset result + 2 ; 指向有效内容的起始地址 int 21h ; 可选:输出换行优化显示效果 mov ah, 09h mov dx, offset endl int 21h mov ax, 4c00h int 21h end start
内容的提问来源于stack exchange,提问作者NewAtC
相关产品推荐
相关产品推荐

