制作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
相关产品推荐
相关产品推荐

