FASM编写的bootloader在Bochs运行报EIP超出CS.limit错误求助
问题排查与修复方案
以下是导致你报错的所有错误点及对应修复方案:
- 读盘前未初始化 es 寄存器
int 0x13 的ah=02h读扇区功能的目标写入地址为es:bx,你启动后未设置 es 寄存器,es 为随机值,读取的内核数据被写入错误内存地址,0x7E00 处没有有效代码。
修复:在 bootloader 最开头添加两行代码:
xor ax, ax mov es, ax
- 磁盘驱动器号硬编码错误
BIOS 启动时会自动将当前启动介质的驱动器号存入dl寄存器,你写死mov dl, 0x01强制读取第二个软盘,绝大多数场景下都会读错扇区。
修复:直接删除mov dl, 0x01这一行即可。 - 读扇区参数缺失磁头号配置
int 0x13 读扇区要求必须设置dh寄存器为磁头号,你未对 dh 赋值,dh 为随机值,会读取错误的扇区位置。
修复:在读盘调用前添加一行mov dh, 0x00。 - 跳转地址与内核重定位配置不匹配
你当前的跳转指令jmp 0x7E00:0x0000对应的物理地址是0x7E00 * 16 + 0 = 0x7E000,但内核段的org 0x7E00是基于段基址为0的偏移,地址完全错位,所有符号引用都会出错。
修复二选一:- 将跳转指令改为
jmp 0x0000:0x7E00,内核org配置保留不变 - 将内核段的
org 0x7E00改为org 0x0000,跳转指令保留不变
- 将跳转指令改为
- 栈指针未配置
你修改ss寄存器后没有立刻设置sp栈指针,一旦触发中断,栈操作会向随机内存写入数据,破坏现有代码。
修复:设置完 ss 后立刻添加一行mov sp, 0xFFFF,用段顶部作为栈底。 - disk.asm 错误处理逻辑缺陷
错误打印逻辑中没有显式每次设置ah=0x0E,且打印完成后没有死循环,会继续执行无效内存数据导致跑飞。
修复:在.l标签的lodsb前添加mov ah, 0x0E,打印结束位置添加死循环:
cli hlt jmp $-1
内容的提问来源于stack exchange,提问作者Våñø Čhêt
相关产品推荐
相关产品推荐

