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

16位汇编引导扇区打印字符串时出现内存越界访问问题

引导扇区代码乱码问题排查

核心错误原因

  • 校验逻辑时序错误:当前代码逻辑是先打印字符、再偏移指针、最后做终止判断,哪怕指针指向了终止符,也会先执行打印逻辑,再偏移到终止符后面的内存位置才做校验,直接跳过了对字符串末尾0终止符的有效校验。
  • 终止符匹配宽度错误:你用16位寄存器cx读取内存做0值判断,但你的字符串终止符是单字节的0,只有当终止符位置+后1个字节同时为0时才会触发退出,只要后续任意字节非0,程序就会继续读取打印内存中的指令、填充值等无关内容,也就是你看到的乱码来源。
  • 缺少BIOS中断必要参数:int 0x10的0x0e teletype输出功能需要明确设置bh(显示页号,通常设为0)、bl(字符显示属性,文本模式下通常设为0x07对应黑底白字),参数缺失可能引发额外的输出异常。

修正后可正常运行的代码

bits 16
org 0x7c00

boot:
    mov bx, string
    call print_string

    hlt

string:
    db 'Booting OS', 0

print_string:
    pusha
    mov ah, 0x0e
    mov bh, 0       ; 设置显示页号为0
    mov bl, 0x07    ; 设置字符属性为黑底白字
printloop:
    mov al, [bx]
    cmp al, 0       ; 先判断当前字符是否为终止符
    je print_fin    ; 是终止符直接退出
    int 0x10        ; 非终止符再执行打印
    inc bx          ; 指针后移
    jmp printloop
print_fin:
    popa
    ret


; Mark the device as bootable
times 510-($-$$) db 0
dw 0xAA55

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:27:02