从bootloader加载内核后lodsb指令失效、print_str打印乱码是什么原因?
问题根因分析
- 内核代码缺失
[ORG 0x9000]伪指令:引导程序已经把内核加载到内存地址0x9000,但内核编译时没有指定运行起始偏移,汇编器默认从0地址计算符号偏移,导致msg字符串的地址计算错误,si寄存器加载的是错误地址,读取到的自然是内存随机乱码。 - 段寄存器未显式初始化:
lodsb指令基于ds段寄存器寻址,进入内核后如果ds值和代码段不匹配,也会导致字符串读取偏移错误。单个字符打印直接操作寄存器输出,不涉及内存寻址,所以可以正常运行。
修复方案
- 在内核代码最开头添加
[ORG 0x9000]伪指令,告诉汇编器这段代码的运行起始地址是0x9000,所有符号地址都会基于这个偏移计算。 - 进入内核入口后首先初始化
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
相关产品推荐
相关产品推荐

