汇编代码编译运行机制及引导扇区特殊代码相关疑问
引导扇区汇编代码疑问解答
代码展示
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
相关产品推荐
相关产品推荐

