You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实模式Hello World在QEMU无输出及格式警告问题排查

解决实模式引导程序的QEMU串口输出与格式警告问题

1. 修复QEMU未指定文件格式警告

QEMU默认会自动检测镜像格式,而你的引导程序是MBR格式的512字节软盘镜像,必须明确告知QEMU使用raw格式:

  • 修改make run中的QEMU命令,用-fda参数指定软盘镜像(自动识别为raw格式):
    qemu-system-i386 -fda boot.bin -serial stdio
    
  • 或者用-drive参数明确指定格式:
    qemu-system-i386 -drive file=boot.bin,format=raw,if=floppy -serial stdio
    

执行以上任意一种命令后,QEMU的格式警告会消失。

2. 让串口捕获引导程序输出

-serial stdio仅能捕获串口端口的输出,若你原引导程序是通过BIOS中断(如int 0x10)输出到屏幕,串口自然无法接收数据。需修改boot.asm,实现串口输出逻辑:

串口初始化与输出代码示例

org 0x7c00
bits 16

start:
    ; 初始化COM1串口(9600波特率,8数据位,1停止位,无校验)
    mov dx, 0x3FB       ; 线路控制寄存器
    mov al, 0x80        ; 允许设置波特率
    out dx, al

    mov dx, 0x3F8       ; 除数寄存器低字节
    mov al, 0x0C        ; 9600波特率对应值(115200/9600=12=0x0C)
    out dx, al
    mov dx, 0x3F9       ; 除数寄存器高字节
    mov al, 0x00
    out dx, al

    mov dx, 0x3FB       ; 线路控制寄存器
    mov al, 0x03        ; 8数据位,1停止位,无校验
    out dx, al

    mov dx, 0x3FC       ; 调制解调器控制寄存器
    mov al, 0x03        ; 使能DTR和RTS
    out dx, al

    ; 输出Hello World到串口
    mov si, msg
send_char:
    lodsb
    or al, al
    jz exit             ; 字符串结束则退出
    call send_serial
    jmp send_char

send_serial:
    push dx
    push ax
wait_tx_empty:
    mov dx, 0x3FD       ; 线路状态寄存器
    in al, dx
    test al, 0x20       ; 检查发送保持寄存器是否为空
    jz wait_tx_empty
    mov dx, 0x3F8       ; 发送保持寄存器
    out dx, al
    pop ax
    pop dx
    ret

exit:
    hlt
    jmp exit

msg: db 'Hello World', 0x0D, 0x0A, 0

; 填充到512字节,添加MBR签名
times 510-($-$$) db 0
dw 0xAA55

确保汇编正确生成镜像

Makefile中的汇编命令需指定输出为二进制格式(以nasm为例):

boot.bin: boot.asm
    nasm -f bin boot.asm -o boot.bin

run: boot.bin
    qemu-system-i386 -fda boot.bin -serial stdio

clean:
    rm -f boot.bin

编译运行后,串口stdio即可捕获到引导程序输出的"Hello World"。

内容的提问来源于stack exchange,提问作者M.E.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 01:22:43