1. 编写代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.code16                   # 声明 16 位模式(实模式)
.global _start

_start:
mov $0x0e, %ah # BIOS 功能:打印字符
mov $'H', %al # 字符 'H'
int $0x10 # 调用 BIOS 中断

mov $'i', %al # 字符 'i'
int $0x10

loop:
jmp loop # 无限循环

.fill 510 - (. - _start), 1, 0 # 填充到 510 字节
.word 0xaa55 # 启动标志

2. 使用 GNU as 将汇编代码转为二进制文件

如果系统只有 as(AT&T 语法)并使用 VMware 测试,也可以制作简易 bootloader。
as 默认输出 ELF,需要再用 objcopy 提取纯二进制文件。

示例代码(boot.s)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.code16
.global _start

_start:
mov $0x0e, %ah
mov $'H', %al
int $0x10

mov $'i', %al
int $0x10

loop:
jmp loop

.fill 510 - (. - _start), 1, 0
.word 0xaa55

3. 编译为二进制文件

1
2
as -o boot.o boot.s               # 汇编生成目标文件
objcopy -O binary boot.o boot.bin # 转换为二进制(去 ELF 头)

检查文件大小(必须是 512 字节):

1
ls -l boot.bin

4. 制作可启动镜像(供 VMware 使用)

(1)创建空镜像文件(1.44MB 软盘镜像)

1
dd if=/dev/zero of=boot.img bs=512 count=2880

(2)把 boot.bin 写入镜像第一扇区

1
dd if=boot.bin of=boot.img conv=notrunc

5. 在 VMware 中测试

  1. 启动 VMware → 创建自定义虚拟机
  2. 选择“其他”或“兼容 x86”类型
  3. boot.img 挂载为软盘(推荐)或 IDE 硬盘
  4. 启动虚拟机
  5. 若成功,屏幕将显示:
1
Hi

这表示 bootloader 已正常运行。


6. 关键注意事项

  • AT&T 语法特点:

    • 寄存器前有 %
    • 源操作数在前,目标在后
  • 若镜像无法启动,请检查:

    • boot.bin 是否为 精确 512 字节

    • 最后两个字节是否为 0xAA55

      1
      hexdump -C boot.bin
    • VMware BIOS 引导顺序是否优先软盘/镜像

  • 扩展功能(如读取磁盘)仍可使用 BIOS 中断 0x13,注意 AT&T 语法写法。


总结

无需 nasm 和 qemu,仅使用系统自带的as + objcopy + dd + VMware即可完成一个最小化 bootloader 的开发与测试流程。