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

调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:45:03