在 Linux 中反汇编 boot.bin(16 位启动扇区)

boot.bin 是纯二进制格式(无 ELF 头)的 16 位 bootloader,因此反汇编时需要手动指定架构与格式。Linux 自带的 objdump 就能完成。


一、反汇编命令

对于 x86 16 位 bootloader:

1
objdump -D -b binary -m i8086 boot.bin

参数说明

  • -D:反汇编全部内容(纯二进制无段信息,只能全部解析)
  • -b binary:指定输入为原始二进制文件
  • -m i8086:指定反汇编架构为 Intel 8086(16 位实模式)

二、反汇编结果解析

以打印 “Hi” 的启动扇区为例,常见结果如下(只截取核心部分):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
boot.bin:     file format binary

Disassembly of section .data:

00000000 <.data>:
0: b4 0e mov $0xe,%ah
2: b0 48 mov $0x48,%al ; 'H'
4: cd 10 int $0x10
6: b0 69 mov $0x69,%al ; 'i'
8: cd 10 int $0x10
a: eb fe jmp 0xa <.data+0xa> ; 无限循环
c: 00 00 add %al,(%bx,%si)
...(填充的 0 被省略)...
1fe: 55 push %bp
1ff: aa stosb

三、关键说明

1. 地址偏移

反汇编地址从 0x0000 开始,但 BIOS 实际会把 boot 扇区加载到:

1
0x7C00

因此真实内存地址 = 反汇编偏移 + 0x7C00


2. 指令与源码对应

你可以通过反汇编结果验证机器码是否与源码匹配,例如:

1
mov $0x0e, %ah

反汇编显示:

1
b4 0e

这样可以检查拼装是否正确。


3. 启动标志(0xAA55)

最后两字节 0x55 0xAA 是启动扇区标志(小端存储),会被识别成某些指令:

1
2
55 = push %bp
aa = stosb

这些并不是代码,只是 BIOS 校验用的数据。


四、可选工具:ndisasm(NASM 提供)

如果安装了 nasm,可以使用它的反汇编工具:

1
ndisasm -b 16 boot.bin

ndisasm 对 16 位代码更友好,输出为 Intel 语法,更容易和源码对照。


总结

使用 objdumpndisasm 可以轻松反汇编 bootloader,从而验证:

  • 指令生成是否正确
  • 填充是否到 512 字节
  • 末尾是否为 0xAA55
  • 代码逻辑是否符合预期

这是调试 bootloader 时非常重要的步骤。