x86引导加载器输出乱码求助:预期Hello, world却显示特殊字符
x86引导加载器显示乱码问题修复
问题根源分析
你的代码存在两处关键错误,导致BIOS读取错误内容并显示乱码:
1. 字符串指针指向错误
在PrintMessage段中,你写了:
mov bp, PrintMessage
这里bp被赋值为PrintMessage标签的地址(即这段打印代码的起始位置),但BIOS的int 0x10(功能号0x13)要求bp指向待输出字符串的起始地址(也就是你定义的Message标签)。错误的指针导致BIOS读取的是汇编指令对应的机器码,而非"Hello, world"字符串,因此显示乱码。
2. BIOS中断参数格式不匹配
你设置了al=1,该参数对应的是「每个字符后跟随一个属性字节」的字符串格式,但你的Message里只存储了纯字符,没有额外的属性字节。这会让BIOS错误地将字符串后续的字节(甚至是代码)当作属性处理,进一步加剧乱码问题。
代码修复步骤
步骤1:修正字符串指针
将mov bp, PrintMessage改为:
mov bp, Message
让bp正确指向"Hello, world"的起始地址。
步骤2:调整BIOS中断参数
将al的值从1改为0,对应「纯字符字符串,属性由bl指定」的格式,和你设置的bx=0xa(黑底亮绿属性)匹配:
mov al, 0
修复后的完整PrintMessage段
PrintMessage: mov ah, 0x13 mov al, 0 mov bx, 0xa xor dx, dx mov bp, Message mov cx, MessageLen int 0x10
额外验证点
MessageLen: equ $-Message的计算是正确的,它会自动得出"Hello, world"的长度(12个字符),无需手动修改。- 引导扇区末尾的
0x55和0xaa签名位置正确,能保证BIOS识别这是可引导扇区。
修复后重新编译测试,Bochs应该就能正确显示"Hello, world"了。
内容的提问来源于stack exchange,提问作者Alonso Fernández
相关产品推荐
相关产品推荐

