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
关键修改说明
- 将
BootLoader:标签移至org 0x7c00之后,确保CPU从合法指令开始执行,跳过数据段。 - 初始化
bx为0x0000,明确设置显示页号bh=0,保证输出到当前可见的显示页。 - 调整
message数据段到代码逻辑之后,避免占用入口地址空间。
内容的提问来源于stack exchange,提问作者hitokiri
相关产品推荐
相关产品推荐

