1.使用系统自带的as+objcopy+dd+VMware完成bios引导程序
1. 编写代码
1 | .code16 # 声明 16 位模式(实模式) |
2. 使用 GNU as 将汇编代码转为二进制文件
如果系统只有 as(AT&T 语法)并使用 VMware 测试,也可以制作简易 bootloader。
as 默认输出 ELF,需要再用 objcopy 提取纯二进制文件。
示例代码(boot.s)
1 | .code16 |
3. 编译为二进制文件
1 | as -o boot.o boot.s # 汇编生成目标文件 |
检查文件大小(必须是 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 中测试
- 启动 VMware → 创建自定义虚拟机
- 选择“其他”或“兼容 x86”类型
- 将
boot.img挂载为软盘(推荐)或 IDE 硬盘 - 启动虚拟机
- 若成功,屏幕将显示:
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 的开发与测试流程。
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
