x86汇编Bootloader打印函数异常:仅输出'S '求助
问题分析与修复
故障核心原因
你的Bootloader打印异常源于两个关键错误:
1. 栈初始化逻辑错误
原代码中栈初始化的写法完全错误:
mov sp, 0xFFFF mov ss, sp
ss是段寄存器,需要赋值段基地址(实模式下通常用0x0000或0x7c00),而非栈指针sp的数值。将0xFFFF赋值给ss后,栈段基地址变为0xFFFF * 16 = 0xFFFF0,超出实模式常规可用内存范围,执行pusha时会破坏内存关键数据,导致打印函数执行异常。
2. 字符串被当作指令执行
loading_bootld_msg直接放在call outstr之后,call outstr返回后,CPU会把字符串的字节流当成x86指令执行,随机篡改寄存器状态(比如bx被修改),导致打印中途终止。
修复后的代码
bootld.asm
[org 0x7c00] [bits 16] ; 正确初始化栈:先设置段寄存器,再设置栈指针 mov ax, 0x0000 mov ss, ax mov sp, 0xFFFF mov ax, 0x7c00 mov ds, ax mov bx, loading_bootld_msg call outstr ; 无限循环,避免执行后续的字符串数据 jmp $ ; 将字符串放到代码执行流之外 loading_bootld_msg: db "Loading Varm OS bootloader...",0x00 times 510 - ( $ - $$ ) db 0x00 dw 0xaa55
验证步骤
保持原编译运行流程不变:
- 编译:
nasm -f bin main.asm -o main.bin - 生成镜像:
dd if=main.bin of=main.img - 运行:
qemu-system-x86_64 -drive file=main.img,format=raw,if=floppy
此时应该能完整打印出Loading Varm OS bootloader...。
内容的提问来源于stack exchange,提问作者varevind
相关产品推荐
相关产品推荐

