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

FASM编写的org 0x7c00 BootLoader输出不符预期求助

MBR BootLoader无法在Bochs中输出"Hello!"的问题排查与修复

问题根源分析

  • 入口点错误:BIOS加载MBR到物理地址0x07C00后,会直接从该地址开始执行机器指令。你的代码中org 0x7c00之后先定义了message数据段,CPU会把"Hello!"的ASCII字节(0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x21)当作指令执行,导致程序逻辑彻底混乱,根本无法走到后续的初始化和打印流程。
  • BIOS中断参数不完整:调用INT 10h的0x0E功能(电传打字式输出)时,必须设置bh寄存器为显示页号(文本模式下默认是0),你的代码未初始化bh,即便程序能走到打印步骤,也可能输出到不可见的显示页,导致屏幕无内容。

修正后的代码

use16 
org 0x7c00

BootLoader: ; 把入口标签放在org之后,确保CPU从指令开始执行
    cli
    xor ax, ax
    mov ds, ax
    mov es, ax
    mov ss, ax
    mov sp, 0xFFFF
    sti

    mov ax, 0002h ; 设置80x25文本模式
    int 10h

    mov bx, 0x0000 ; bh=0(显示页0),bl=0(文本模式下颜色可忽略)
    mov dx, 0x0100 ; dh=1(第2行),dl=0(第1列)
    mov cx, len

print_loop:
    mov ah, 0x0E
    mov al, [message + bx]
    int 10h
    
    inc bx
    cmp bx, len
    jl print_loop

    jmp $

; 把数据段放在代码之后,避免干扰入口执行
message db "Hello!"
len equ $ - message

times 510-($-$$) db 0 
dw 0xAA55

关键修改说明

  1. 将BootLoader:标签移至org 0x7c00之后,确保CPU从合法指令开始执行,跳过数据段。
  2. 初始化bx为0x0000,明确设置显示页号bh=0,保证输出到当前可见的显示页。
  3. 调整message数据段到代码逻辑之后,避免占用入口地址空间。

内容的提问来源于stack exchange,提问作者hitokiri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:52:34