Bootloader跳转地址异常且无法打印信息问题求助
软盘Bootloader跳转与打印问题排查
一、jmp 0x7E0:0x0跳转地址异常
你遇到的跳转地址错误,核心是NASM未明确指定16位实模式导致的汇编解析错误:
- 实模式下物理地址计算规则是
段值<<4 + 偏移,但如果代码开头没加bits 16,NASM会默认按32位模式处理指令,把0x7E0解析成32位段值,最终计算出错误的物理地址0x7E00000。 - 解决步骤:
- 在bootloader代码第一行添加
bits 16,强制NASM按16位实模式汇编。 - 同时加上
org 0x7C00,保证代码中所有符号地址基于BIOS加载bootloader的基地址0x7C00计算。 - 正确的跨段跳转写法:
jmp 0x0:0x7E00(物理地址0x0<<4 +0x7E00=0x7E00),和同段跳转jmp 0x7E00效果一致,后者更简洁。
- 在bootloader代码第一行添加
二、int 0x10打印时test al, al直接为0
这个问题大概率是**int 0x10调用参数错误或字符串初始化问题**:
- 调用
int 0x10的0x0E号(Teletype输出)功能时,必须先设置正确参数:ah=0x0E(功能号)、bh=0x00(显示页号)、bl=0x07(默认文本属性),al赋值为要打印的字符。 - 如果是循环打印字符串,要确保字符串以非0字符开头,且加载字符串的
si寄存器指向正确地址。
示例正确打印代码:
bits 16 org 0x7C00 start: mov si, hello_msg call print_string ; 后续加载第二扇区的代码... print_string: mov ah, 0x0E mov bh, 0x00 mov bl, 0x07 .next_char: lodsb test al, al jz .done int 0x10 jmp .next_char .done: ret hello_msg db 'Hello World', 0x0D, 0x0A, 0
三、额外验证要点
- 第二扇区加载正确性:
使用int 0x13读扇区后,必须检查进位标志(CF)是否为0,确认加载成功。示例代码片段:; 加载第二扇区到0x0:0x7E00 mov ah, 0x02 mov al, 1 mov ch, 0 mov cl, 2 mov dh, 0 mov dl, 0x00 mov bx, 0x7E00 mov es, bx xor bx, bx int 0x13 jc disk_error ; CF置位则跳转至错误处理 - 镜像制作验证:
确认dd命令的seek参数正确,seek=1对应软盘的第二扇区(从0开始计数),避免扇区写入位置错误。
内容的提问来源于stack exchange,提问作者Zamah
相关产品推荐
相关产品推荐

