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

Bootloader跳转地址异常且无法打印信息问题求助

软盘Bootloader跳转与打印问题排查

一、jmp 0x7E0:0x0跳转地址异常

你遇到的跳转地址错误,核心是NASM未明确指定16位实模式导致的汇编解析错误:

  • 实模式下物理地址计算规则是段值<<4 + 偏移,但如果代码开头没加bits 16,NASM会默认按32位模式处理指令,把0x7E0解析成32位段值,最终计算出错误的物理地址0x7E00000。
  • 解决步骤:
    1. 在bootloader代码第一行添加bits 16,强制NASM按16位实模式汇编。
    2. 同时加上org 0x7C00,保证代码中所有符号地址基于BIOS加载bootloader的基地址0x7C00计算。
    3. 正确的跨段跳转写法:jmp 0x0:0x7E00(物理地址0x0<<4 +0x7E00=0x7E00),和同段跳转jmp 0x7E00效果一致,后者更简洁。

二、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

三、额外验证要点

  1. 第二扇区加载正确性:
    使用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置位则跳转至错误处理
    
  2. 镜像制作验证:
    确认dd命令的seek参数正确,seek=1对应软盘的第二扇区(从0开始计数),避免扇区写入位置错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:47:27