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

制作x86汇编内核时无法将输入完整存入缓冲区问题求助

问题原因分析

你的代码每次将输入字符存入input_buffer的同一个内存地址,新输入的字符会直接覆盖之前存储的内容,自然只能保留最后一个字符。核心问题是没有使用索引跟踪缓冲区的写入位置,所有字符都存在了缓冲区的起始位置。

修复后的代码示例

首先,要为缓冲区预留足够空间,并添加索引变量:

input_buffer times 256 db 0 ; 定义256字节的缓冲区,初始化为0
buffer_index db 0           ; 记录缓冲区当前写入位置的索引

然后修改prompt处的输入处理逻辑:

prompt:
    call print_string
    mov bl, [buffer_index]   ; 初始化索引为当前已存储的位置
    .input_loop:
    call wait_for_keypress
    cmp al, 13               ; 检查是否按下回车
    je .exit

    ; 将字符存入缓冲区的当前索引位置
    mov [input_buffer + bx], al
    ; 回显输入的字符
    mov ah, 0x0E
    mov bh, 0
    mov bl, 7
    int 10h

    inc bl                   ; 索引加1,准备存储下一个字符
    ; 可选:缓冲区溢出检查,防止破坏其他内存
    cmp bl, 256
    je .exit

    jmp .input_loop
.exit:
    mov [input_buffer + bx], 0 ; 在缓冲区末尾添加字符串结束符(方便后续处理)
    mov [buffer_index], bl     ; 保存当前索引,供后续操作使用
    ret
关键修改说明
  • 用bl作为缓冲区索引,每次存储字符后执行inc bl,让新字符写入缓冲区的下一个字节,避免覆盖之前的内容。
  • 在缓冲区末尾添加0结束符,便于后续通过字符串操作指令处理输入内容。
  • 增加缓冲区溢出检查,防止写入超出定义范围的内存区域,避免破坏其他数据。
  • 移除了原代码中重复的mov [input_buffer], al语句,该操作完全冗余。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:32:10