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

相同代码与NASM编译器生成不同二进制,Bootloader启动失败求助

解决Bootloader编译后QEMU卡引导的问题

我来帮你捋捋这个问题——我之前也踩过类似Bootloader编译差异导致卡引导的坑,大概率是编译细节或者引导扇区格式的问题,咱们一步步排查:

一、先核对NASM编译参数和版本

这是最容易出问题的环节,教授的编译流程肯定有特定的选项,别自己瞎改:

  • 确认你用的NASM命令和教授完全一致!比如教授可能用的是 nasm -f bin boot.asm -o BOOT12.SYS,要是你加了-g(带调试符号)、-F elf(选了错误的输出格式)这类额外参数,或者漏了-f bin(NASM默认输出格式不是纯二进制),编译出的二进制会完全不一样。
  • 查NASM版本!不同版本的NASM对某些语法的解析可能有细微差异,比如旧版本对times伪指令的处理、或者某些宏的展开逻辑不同。用nasm -v看看你的版本,和教授的对比下,差太多的话建议装和教授同款的版本。

二、验证引导扇区的格式合法性

BIOS对引导扇区有严格的硬性要求,不满足的话直接卡引导:

  • 检查文件大小必须是512字节!用ls -l BOOT12.SYS看大小,或者用xxd BOOT12.SYS | tail -2确认最后两个字节是aa55(注意字节序,实际存储是0x55AA,用xxd看会显示成aa55)。要是大小不对,要么是代码里没加times 510-($-$$) db 0这类填充指令,要么是编译格式错了。
  • 确认代码里有没有org 0x7C00!BIOS会把引导扇区加载到内存地址0x7C00,要是没加这个伪指令,编译出的跳转、内存访问地址全是错的,程序一跑就崩。

三、深挖二进制差异的具体原因

既然两个文件差异明显,直接对比找问题:

  • 把两个二进制转成十六进制文本对比:用xxd your_BOOT12.SYS > your.txt,xxd prof_BOOT12.SYS > prof.txt,然后用diff your.txt prof.txt看哪里不一样。如果差异集中在代码段,那基本就是编译参数或版本的锅;如果只是填充的空字节不同,只要最后两个字节是0xAA55,一般不影响引导。

四、用QEMU调试看程序卡在哪

要是前面的检查都没问题,直接看程序执行流程:

  • 启动QEMU时加调试参数:qemu-system-x86_64 -fda BOOT12.SYS -s -S,这会让QEMU暂停在启动状态,等调试器连进来。
  • 开另一个终端用gdb调试:输入gdb,然后target remote localhost:1234,接着b *0x7C00在引导扇区起始地址设断点,c继续执行,一步步单步调试(si指令),看程序到底卡在哪条指令,是跳转错了地址,还是BIOS中断调用参数写错了。

五、检查BIOS打印中断的正确性

要是程序卡在打印“NP”的步骤,大概率是int 0x10中断的参数错了:

  • 确认打印字符的参数:AH要设为0xE(电传输出功能),AL是要打印的字符(比如'N'的ASCII码0x4E),BH是页号(一般设0),BL是字符属性(可以设0)。参数写错的话,中断执行会异常,直接导致程序挂起。

内容的提问来源于stack exchange,提问作者Nemanja Nedeljković

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:22:39