为什么从USB启动时汇编编写的引导扇区代码无法显示字符?
问题可能的原因如下:
1. U盘写入方式错误
- 不能直接把
boot.bin复制到U盘的文件系统中,引导扇区需要写入U盘的物理第一个扇区(LBA 0地址)才会被BIOS识别。正确的写入命令是sudo dd if=boot.bin of=/dev/sdX bs=512 count=1,注意将/dev/sdX替换为你的U盘对应的块设备名,不要误写为硬盘设备,否则会损坏硬盘引导数据。 - 写入后可执行
sudo hexdump -C /dev/sdX | head验证,输出末尾两个字节必须为55 aa才说明写入成功。
2. BIOS启动模式不匹配
- 现在多数新电脑默认开启UEFI安全启动,你的代码是传统Legacy BIOS架构的引导程序,UEFI模式下不会识别无合法签名的Legacy引导扇区。需要进入BIOS关闭安全启动(Secure Boot),并且将启动模式切换为Legacy BIOS/CSM兼容模式,才能正常引导。
- 部分电脑需要手动在启动项选择列表中选中带Legacy标识的U盘启动项,选择UEFI开头的U盘启动项会引导失败。
3. 显示模式未初始化
- QEMU启动时默认已经初始化了80x25文本模式,所以
int 0x10的0x0e输出功能可以正常运行。但部分实机BIOS引导时可能处于图形模式,或显示页寄存器配置异常,直接调用输出中断没有反应。可以在代码最开头添加文本模式初始化逻辑:
; 初始化80x25 16色文本模式 mov ax, 0x03 int 0x10
重新编译写入后再测试即可。
4. U盘硬件兼容性问题
- 部分老旧主板对大容量U盘兼容性差,或要求U盘使用MBR分区表、扇区大小为512字节。可以尝试将U盘格式化为MBR分区表的FAT32格式后重新写入引导扇区,或换用2G以内的小容量老U盘测试,兼容性通常更好。
内容的提问来源于stack exchange,提问作者JTH87
相关产品推荐
相关产品推荐

