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

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的偏移,地址完全错位,所有符号引用都会出错。
    修复二选一:
    1. 将跳转指令改为 jmp 0x0000:0x7E00,内核 org 配置保留不变
    2. 将内核段的 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:24:04