求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'。
编译与测试
- 编译代码:
nasm -f bin boot.asm -o boot.bin - 写入软盘镜像:
dd if=boot.bin of=floppy.img bs=512 count=2 - 在VirtualBox中挂载
floppy.img作为软盘启动:- 保留重置指令:启动后屏幕显示
OK - 删除重置指令:启动后屏幕大概率显示
H
- 保留重置指令:启动后屏幕显示
内容的提问来源于stack exchange,提问作者Bastien Portigo
相关产品推荐
相关产品推荐

