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

从bootloader加载内核后lodsb指令失效、print_str打印乱码是什么原因?

问题根因分析
  • 内核代码缺失[ORG 0x9000]伪指令:引导程序已经把内核加载到内存地址0x9000,但内核编译时没有指定运行起始偏移,汇编器默认从0地址计算符号偏移,导致msg字符串的地址计算错误,si寄存器加载的是错误地址,读取到的自然是内存随机乱码。
  • 段寄存器未显式初始化:lodsb指令基于ds段寄存器寻址,进入内核后如果ds值和代码段不匹配,也会导致字符串读取偏移错误。单个字符打印直接操作寄存器输出,不涉及内存寻址,所以可以正常运行。
修复方案
  1. 在内核代码最开头添加[ORG 0x9000]伪指令,告诉汇编器这段代码的运行起始地址是0x9000,所有符号地址都会基于这个偏移计算。
  2. 进入内核入口后首先初始化ds、es寄存器,和引导程序的段设置保持一致,修改后的内核入口代码如下:
bits 16
[ORG 0x9000]
entry:
mov ax, 0
mov ds, ax
mov es, ax
mov ah, 0x0700
int 0x10
mov si, msg
call print_str

修复后si加载的msg地址会是0x9000 + 字符串在汇编文件中的偏移,正好指向你定义的字符串实际内存位置,lodsb就能正确读取每个字符输出。

内容的提问来源于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.05 14:36:04