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

x86汇编bootloader代码如何实现同时输出两段指定内容

问题根源

  • 第一段字符串打印结束后执行了jmp $,直接进入死循环,后续打印A-Z的代码完全没有执行机会
  • 调用int 0x10的0x0e(teletype输出)功能时寄存器配置错误:该功能要求ah = 0x0e,bh为显示页号(实模式下默认设为0即可),原代码将0x0e错赋值给了bh
  • 字符串变量varName放在了执行代码中间,存在被误判为指令执行的风险

修正后完整代码

[org 0x7c00]
; 提前配置int 0x10 0xe功能的公共参数,后续无需重复设置
mov ah, 0x0e
mov bh, 0
mov bx, varName

printString:
    mov al, [bx]
    cmp al, 0
    je end_print_str
    int 0x10
    inc bx
    jmp printString
end_print_str:
; 可选:添加回车换行,让两段内容分行展示
mov al, 0x0d
int 0x10
mov al, 0x0a
int 0x10

; 打印Z到A的逻辑
mov al, 'Z'
int 0x10
loop:
    dec al
    cmp al, 'A' - 1
    je exit
    int 0x10
    jmp loop
exit:
    jmp $

; 字符串变量统一放在所有执行代码之后
varName:
    db "Hello World", 0

times 510-($-$$) db 0
dw 0xaa55

修改说明

  • 移除了第一段打印结束后的jmp $死循环,保证后续逻辑可以正常执行
  • 修正了int 0x10中断的寄存器配置,统一提前设置好ah和bh的值,避免重复赋值出错
  • 调整了字符串变量varName的存储位置,放在所有可执行代码的末尾
  • 可选添加了换行输出逻辑,不需要可以直接删除对应三行代码即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:24:00