如何向img软盘指定扇区写入?Int 13/AH=03h写入异常求助
问题分析与解决方法
一、CHS寻址下0/0/10写入失败的原因
你遇到的0/0/10扇区写入失败,大概率是Int 13h/AH=03h的参数寄存器设置错误。该中断的扇区号和柱面号是拆分存储的:
CL寄存器低6位存储扇区号(1-63),高2位存储柱面号的低2位CH寄存器存储柱面号的低8位DH存储磁头号
当写入0/0/10时,扇区号10的二进制是00001010,所以CL应该设置为0Ah(二进制00001010,高2位为0,对应柱面0的高2位),CH=0,DH=0。如果代码里错误地把扇区号按10进制直接赋值、或是误操作了CL的高2位,就会导致寻址错误,写入失败。
另外要注意:Int 13h写操作要求缓冲区必须位于内存低64KB区域(即ES:BX指向的地址不能超过0FFFFh),如果程序数据缓冲区在高内存,也会触发写入失败。
二、跨磁头/柱面写入失败的原因
除上述参数问题外,跨磁头/柱面写入失败还有以下常见诱因:
- 柱面号参数拆分错误:比如写入柱面号为1时,柱面号二进制是
00000001,此时CH取低8位01h,CL的高2位取柱面号高2位00,再加上扇区号(比如1),所以CL=01h。如果直接把柱面号全放到CH、忽略CL的高2位,会寻址到错误柱面。 - 软盘介质参数不匹配:VirtualBox模拟的1.44MB软盘CHS参数为80柱面(0-79)、2磁头(0-1)、18扇区/磁道(1-18)。若代码写入超出该范围的CHS值(比如磁头2、柱面80),会直接触发中断失败。
- 未提前重置驱动器:写入前未执行
AH=00h的Int 13h重置驱动器,可能导致驱动器处于错误状态,无法执行写入操作。
三、Int 26h失败的原因
Int 26h是DOS的绝对磁盘写中断,使用有严格限制:
- 必须运行在实模式DOS环境下(纯汇编引导程序中无法直接调用,除非已加载DOS)
- 参数要求
CX为写入扇区数,DX为起始逻辑扇区号(逻辑扇区号=柱面磁头数扇区数 + 磁头*扇区数 + 扇区号-1),DS:BX指向缓冲区。若逻辑扇区号计算错误、或未在DOS环境下调用,都会失败。
四、Windows下手动写入软盘扇区的方法
无需汇编的话,有两种简单可行的方案:
使用dd命令(推荐):通过Git Bash或WSL在Windows中执行,命令格式如下:
# 将program.bin写入disk.img的第N个逻辑扇区(N从0开始计数) dd if=program.bin of=disk.img seek=N bs=512 count=1 conv=notrunc其中
bs=512对应软盘扇区大小,seek=N表示跳过N个扇区后写入,conv=notrunc确保不截断img文件。使用WinHex工具:
- 打开WinHex,加载软盘img文件
- 按
Ctrl+G打开跳转窗口,选择"扇区",输入目标CHS或逻辑扇区号 - 将需要写入的程序数据复制到对应扇区位置,保存即可
内容的提问来源于stack exchange,提问作者Bastien Portigo
相关产品推荐
相关产品推荐

