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

开发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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:48:02