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

求16位模式下Int 13H AH=00h实用NASM示例(含实际影响)

实用的Int 13H AH=00h重置磁盘示例(NASM 16位引导扇区)

下面是针对VirtualBox软盘镜像环境的16位引导扇区代码,必须保留Int 13H AH=00h重置指令,否则磁盘读取操作会直接失败并触发错误提示。

示例代码

org 0x7c00
bits 16

start:
    ; 磁盘控制器重置指令 (AH=00h) - 删除此段会导致后续读取失败
    mov ah, 0x00
    mov dl, 0x00  ; 目标软盘驱动器编号(0为A盘)
    int 0x13
    jc disk_reset_fail  ; 重置失败则跳转至错误处理

    ; 读取软盘第2个扇区到内存0x7e00位置
    mov ah, 0x02
    mov al, 0x01  ; 读取扇区数量:1个
    mov ch, 0x00  ; 柱面编号:0
    mov cl, 0x02  ; 扇区编号:2(软盘扇区从1开始计数)
    mov dh, 0x00  ; 磁头编号:0
    mov dl, 0x00  ; 驱动器编号:0
    mov bx, 0x7e00; 读取数据的目标内存地址
    int 0x13
    jc disk_read_fail   ; 读取失败则跳转至错误处理

    ; 读取成功,跳转到第二个扇区执行测试代码
    jmp 0x7e00

; 重置磁盘失败的错误处理
disk_reset_fail:
    mov ah, 0x0e
    mov al, 'R'   ; 显示字符R表示重置失败
    int 0x10
    jmp $         ; 死循环

; 读取扇区失败的错误处理
disk_read_fail:
    mov ah, 0x0e
    mov al, 'H'   ; 显示字符H表示读取失败
    int 0x10
    jmp $

; 填充引导扇区至512字节,并添加引导标志
times 510 - ($ - $$) db 0
dw 0xaa55

; 第二个扇区的测试代码(会被读取到0x7e00)
second_sector:
    mov ah, 0x0e
    mov al, 'O'
    int 0x10
    mov al, 'K'
    int 0x10
    jmp $
times 1024 - ($ - $$) db 0  ; 确保第二个扇区数据被写入镜像

重置指令的必要性

在VirtualBox的软盘模拟环境中,磁盘控制器可能残留上一次操作的错误状态(比如未完成的指令、错误标记)。Int 13H AH=00h会强制控制器重置,清除这些残留状态,将磁头重新校准到0磁道,确保后续的读取操作能正常执行。

如果删除重置指令,控制器可能处于不可用状态,导致Int 13H AH=02h读取操作返回错误(CF标志置位),程序会进入disk_read_fail分支显示'H';而保留重置指令时,控制器被正确初始化,读取操作成功后会显示'OK'。

编译与测试

  1. 编译代码:
    nasm -f bin boot.asm -o boot.bin
    
  2. 写入软盘镜像:
    dd if=boot.bin of=floppy.img bs=512 count=2
    
  3. 在VirtualBox中挂载floppy.img作为软盘启动:
    • 保留重置指令:启动后屏幕显示OK
    • 删除重置指令:启动后屏幕大概率显示H

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:52:53