7

我正在使用 Bochs 2.4.5 编写引导扇区代码。我使用 INT 13H 从软盘读取扇区。但我发现如果要读取的扇区数 > 72,则 INT13 会失败。返回码是AH=1。下面是代码,这里是INT13。返回码是 AH=1。

为什么 INT 13H 不能读取超过 72 个扇区?

   xorb %ah, %ah
   xorb %dl, %dl
   int $0x13      # reset the floppy

   movw $0x8000, %ax
   movw %ax,%es        
   movw $0, %bx  # ES:BX is the buffer  
   movb $0x02, %ah
   movb $73, %al # how many sectors to read. 72 is ok, but >=73 is wrong.
   movb $0, %ch
   movb $1, %cl
   movb $0, %dh
   movb $0, %dl

   int $0x13

谢谢你的帮助。

更新

按照Matthew Slattery的指示,我找到了相应的代码。我在这里列出了它,以供像我一样困惑的其他人使用。完整代码位于此处

7220       if ((drive > 1) || (head > 1) || (sector == 0) ||
7221           (num_sectors == 0) || (num_sectors > 72)) {
7222         BX_INFO("int13_diskette: read/write/verify: parameter out of range\n");
7223         SET_AH(1);
7224         set_diskette_ret_status(1);
7225         SET_AL(0); // no sectors read
7226         SET_CF(); // error occurred
7227         return;
7228       }
4

3 回答 3

5

您正在使用 Bochs,因此可以在Bochs BIOS 源代码中找到答案:BIOS 正在对扇区数执行显式范围检查,如果大于 72(或等于 0)则拒绝它。

于 2010-09-05T12:27:34.767 回答
2

Matthew Slattery指出的简单答案是,这仅仅是 Bochs 执行的范围检查。这是基于 2.88Mb 软盘多磁道软盘控制器读取限制为 72 个扇区。


令人高兴的答案是,由于向后兼容性,当前的 BIOS 仅支持单面读取,对于 1.44Mb 软盘来说,最多 18 个扇区。这取决于起始扇区,因此实际最大值将达到轨道上剩余的总数。从 USB 闪存驱动器引导和运行是用于 os dev 的过时软盘的简单替代方案。根据引导驱动器标识符(dl寄存器),可以使用相同的 BIOS 磁盘/软盘功能。

于 2010-09-05T18:47:56.730 回答
0

根据MS-DOS 支持的标准软盘,1.44 MB 软盘上每个磁道的扇区数为 18。由于 18*4 = 72,这可能是一个线索。BIOS 可能不想一次读取超过一定数量的磁道。

于 2010-09-05T10:58:08.867 回答