BIOS中断0x10/AH=0x13写字符串仅移动光标无输出问题求助
问题原因与解决方案
你的代码核心问题有两个可复现的诱因,对应修复方案如下:
1. 编译参数缺失导致地址重定位错误
如果你在64位Linux环境下编译,默认as和ld会按64位目标处理程序,即使你加了.code16伪指令,也可能出现16位立即数地址截断错误。需要显式指定32位目标模式:
修改编译命令为:
as --32 hello.s -o hello.o ld -m elf_i386 -N -e start -Ttext=0x7c00 hello.o -o hello.elf objcopy -O binary hello.elf hello
2. QEMU --nographic 模式的显示限制
QEMU的--nographic模式会禁用VGA图形界面,仅将串口输出重定向到当前终端:
- 你自定义的
print函数用int 0x10 AH=0xE单字符打印,该功能会被QEMU特殊处理,输出会同步到串口,所以能正常显示。 AH=0x13批量写字符串功能是直接操作VGA显存,QEMU在--nographic模式下不会将这部分显存内容同步到串口,因此你只能看到光标移动(光标状态由BIOS维护,会被同步),看不到实际字符。
验证修复:
去掉运行命令中的--nographic参数,用图形界面运行即可看到输出:
qemu-system-i386 -hda hello
如果必须使用无图形模式,建议继续使用AH=0xE实现打印功能,或额外配置QEMU开启VGA文本缓冲区到串口的重定向。
可选兼容优化
为了适配更多BIOS实现,建议在代码开头显式初始化DS寄存器并清零方向标志位:
start: xor %ax, %ax mov %ax, %ds cld mov $start, %sp # 后续代码不变
内容的提问来源于stack exchange,提问作者nickelpro
相关产品推荐
相关产品推荐

