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

汇编代码编译运行机制及引导扇区特殊代码相关疑问

引导扇区汇编代码疑问解答

代码展示

jmp $
times 510 - ($ - $$) db 0
db 0x55, 0xaa

疑问解答

1. 无限循环后其余代码怎么运行?是编译阶段执行吗?

第一行的jmp $确实是运行时的无限循环,但后面的内容并不是可执行代码——它们是汇编器的伪指令,在汇编阶段就完成处理:

  • times 510 - ($ - $$) db 0:让汇编器往生成的二进制文件里填充足够的0,确保从文件开头到此处的字节数为510。其中$代表当前指令的地址,$$代表当前段的起始地址,$ - $$就是当前已生成的字节数。
  • db 0x55,0xaa:直接在文件末尾写入这两个字节,凑够引导扇区要求的512字节,这是BIOS识别引导扇区的标志。

运行时CPU只会执行第一行的无限循环,后面的0填充内容和引导标志不属于可执行代码,不会被CPU运行。

2. 没有start段为什么能正常工作?

普通应用程序需要start段是因为链接器需要明确程序的入口点,但引导扇区是BIOS直接加载执行的特殊场景:

  • BIOS会把引导扇区加载到内存地址0x7c00,然后直接从这个地址开始执行第一条指令,完全不需要链接器处理段和入口点的逻辑。
  • 这段代码没有定义任何段,汇编器默认会把所有内容放在同一个连续段中,生成的二进制文件刚好是512字节,完全符合BIOS的加载要求,因此不需要start段也能正常被识别执行。

3. 这段汇编代码的编译和运行流程

汇编阶段

以NASM汇编器为例,执行命令:

nasm boot.asm -o boot.bin

汇编器会解析指令和伪指令:将jmp $翻译成对应的机器码,处理times伪指令填充0,最后追加0x55,0xaa,生成一个刚好512字节的二进制文件boot.bin。

运行阶段

可以用虚拟机(如QEMU)加载该二进制文件,执行命令:

qemu-system-x86_64 boot.bin

BIOS启动时会扫描存储设备的第一个扇区,若末尾存在0x55,0xaa,就将该扇区加载到0x7c00,然后跳转到0x7c00执行第一条指令——也就是那个无限循环,此时虚拟机将停在该循环状态。

内容的提问来源于stack exchange,提问作者Damian Kowalski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 12:45:44