开发16位操作系统时input_msg无法正常打印的问题求助
问题排查与修复方案
核心问题列表
- stosb写入逻辑错误:每次获取按键后都将
di重置为input_msg起始地址,导致新输入的字符始终覆盖input_msg的第一个字节,无法累积存储输入内容 - 回车键处理逻辑错误:
handle_enter中先给si赋值为input_msg,立刻又覆盖为cli_default_text,导致input_msg完全没有被执行打印 - 字符串无结束符:输入内容写入
input_msg后没有补充字符串结束标记0,print_str函数依赖0判断打印终止,会输出内存乱码 - 清屏调用参数缺失:BIOS中断
int 0x10的ah=0x07功能需要补充滚动行数、显示属性、屏幕坐标参数,否则清屏行为不可预期 - 输入缓冲区过小:
input_msg仅定义了4字节空间,最多容纳3个有效字符,容易发生缓冲区溢出
修复后的完整代码
bits 16 org 0x9000 entry: cld call clear_screen_widetext mov si, loaded_kernel call print_str ; 初始化input_msg的写入指针 mov di, input_msg jmp handle_enter hang: mov ah, 0x10 int 0x16 mov [input_char], al ; 回车键触发提交逻辑,不写入缓冲区 cmp al, 13 je handle_enter ; 缓冲区满则忽略输入,避免溢出 cmp di, input_msg_end - 1 jae hang stosb mov si, input_char call print_str jmp hang print_str: lodsb mov ah, 0x0E cmp al, 0 je done int 0x10 jmp print_str clear_screen_widetext: mov ah, 0x07 mov al, 0 ; 滚动0行即清全屏 mov bh, 0x07 ; 黑底白字显示属性 mov cx, 0x0000 ; 屏幕左上角坐标(0,0) mov dx, 0x184F ; 屏幕右下角坐标(24,79),对应80x25标准文本模式 int 0x10 ret handle_enter: ; 给输入的字符串补结束符,保证print_str正常终止 mov byte [di], 0 mov si, enter_handle_data call print_str ; 先打印用户输入内容 mov si, input_msg call print_str ; 再打印CLI提示符 mov si, cli_default_text call print_str ; 重置缓冲区指针,准备下一轮输入 mov di, input_msg jmp hang done: ret data: loaded_kernel db 'Loaded Kernel Successfully', 13, 10, 0 input_char db 0, 0 ; 扩大输入缓冲区到32字节,可容纳31个有效字符 input_msg db 32 dup(0) input_msg_end: enter_handle_data db 10, 0 cli_default_text db '>>>', 0
内容的提问来源于stack exchange,提问作者D_Man
相关产品推荐
相关产品推荐

