开发简单bootloader时汇编指令jmp $的作用是什么?
关于bootloader代码中
jmp $的功能解答 你对jmp $的字面理解完全正确:这确实是跳转到当前指令地址的死循环,CPU执行到这条指令后会无限重复执行它,永远不会向后运行。
你疑惑的「会不会无法执行后面的代码」属于认知误区:后面两行内容本来就不是需要CPU执行的代码,是主引导记录(MBR)的校验标识,不需要被运行,具体逻辑如下:
- x86架构的BIOS完成上电自检后,会读取存储设备的第一个扇区(固定大小512字节),检查该扇区的最后两个字节是否为
0x55和0xaa,如果符合就判定这是合法的可引导扇区,将整个扇区内容加载到内存0x7c00地址处,然后跳转到0x7c00开始执行代码。 - 你贴的是最小可引导镜像的标准Demo写法,各部分作用如下:
- 开头的
jmp $是整个扇区唯一的可执行逻辑,作用就是让CPU在完成引导后停在这里,一般用于测试BIOS能不能正常识别你的引导扇区,不需要执行后续引导逻辑时就用这种最简写法。 - 第二行
times 510-($-$$) db 0(你贴的代码里漏了db 0后缀,属于常规笔误)的作用是用0填充空白,把前面的代码长度补到刚好510字节,保证最后的魔数刚好落在扇区的最后两个字节位置。 - 第三行的
0x55 0xaa是BIOS识别可引导扇区的魔数,属于纯校验用的数据,不需要CPU执行,完全不存在「需要运行到这行」的需求。
- 开头的
如果后续要扩展bootloader功能,比如加载内核镜像、跳转到内核入口之类的,把开头的jmp $替换成对应业务逻辑即可。
内容的提问来源于stack exchange,提问作者ZeroSkill Gaming
相关产品推荐
相关产品推荐

