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

NASM是否与特定硬件配置不兼容?HP Compaq dc7600启动异常求助

问题描述

我编写的汇编代码可在Qemu及Intel Pentium系统正常运行,但在以Intel Celeron为核心的HP Compaq dc7600计算机上启动时,系统提示“Non-System disk or disk error”,提示卷无效。
代码通过以下命令生成二进制文件并写入U盘启动:

nasm -fbin mbr.asm -o mbr.bin
dd if=mbr.bin of=/dev/sdb

汇编代码如下:

[BITS 16]

main:
    cli
    hlt  

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

请问这是系统配置错误吗?若为配置错误,需修改什么?(参考手册8.4节)

问题分析与解决

这不是系统配置错误,而是你的MBR代码不符合HP Compaq dc7600这类老Celeron主板的启动要求。

QEMU和部分Pentium系统对极简MBR兼容性较高,但这类老主板的BIOS会要求MBR执行基础的系统初始化操作,仅cli+hlt的代码会被BIOS判定为无效系统盘。

结合参考手册8.4节的要求,你需要修改MBR代码,补充必要的初始化步骤,示例修改如下:

[BITS 16]
ORG 0x7C00  ; 指定BIOS加载MBR的内存起始地址

main:
    cli
    ; 初始化段寄存器,确保内存访问地址正确
    mov ax, 0x0000
    mov ds, ax
    mov es, ax
    mov ss, ax
    mov sp, 0x7C00  ; 设置栈指针到MBR上方,避免覆盖代码
    sti

    ; 可选:通过BIOS中断输出字符,验证MBR正常执行
    mov ah, 0x0E
    mov al, 'X'
    mov bh, 0x00
    mov bl, 0x07
    int 0x10

halt_loop:
    hlt
    jmp halt_loop  ; 无限循环,避免停机后BIOS误判

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

关键修改点:

  • 添加ORG 0x7C00:明确BIOS加载地址,配合段寄存器初始化保证代码寻址正确
  • 初始化DS、ES、SS段寄存器为0:统一内存访问的段基址
  • 设置栈指针SP:为后续操作(包括BIOS中断调用)提供合法的栈空间
  • 替换单纯hlt为带循环的停机:避免CPU进入停机状态后BIOS误判启动失败
  • 可选的屏幕输出:直观验证MBR是否被正确执行

修改后重新编译写入U盘,即可在HP Compaq dc7600上正常启动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:05:19