c-如何从带有扇区的软盘中读取块



我需要从操作系统之前的状态读取软盘,我有一个函数要读取,但它似乎无法读取第四个扇区。。。

void get_block(blk, buf) int blk; char buf[]
{
   int cyl, head, sector;
   cyl = ((blk*2) / 18) / 2;
   head = ((blk*2) / 18) % 2;
   sector = (blk*2) % 18;
   // Read first sector <<Dies here if blk > 2>>
   diskr(cyl, head, sector, buf);
   // Increment
   if ((sector = (++sector % 18)) == 0)
      if ((head = (++head % 2)) == 0)
         cyl++;
   // Read second sector <<Dies here if blk == 2>>
   diskr(cyl, head, sector, buf+512);
}

知道为什么吗?我是否错误地从块转换?

否,假设您的磁盘是1.44M"软盘"(80个柱面,2个磁头/柱面,18个扇区/磁头,512字节/扇区),这些计算应该是可以的,如以下程序所示:

#include <stdio.h>
int main (void) {
    int blk, cyl, head, sector;
    for (blk = 0; blk <= 18; blk++) {
        cyl = ((blk*2) / 18) / 2;
        head = ((blk*2) / 18) % 2;
        sector = (blk*2) % 18;
        printf ("%2d (a) -> %2d %2d %2d", blk, cyl, head, sector);
        if ((sector = (++sector % 18)) == 0)
            if ((head = (++head % 2)) == 0)
                cyl++;
        printf (" (b) -> %2d %2d %2dn", cyl, head, sector);
    }
    return 0;
}

其输出为:

 0 (a) ->  0  0  0 (b) ->  0  0  1
 1 (a) ->  0  0  2 (b) ->  0  0  3
 2 (a) ->  0  0  4 (b) ->  0  0  5
 3 (a) ->  0  0  6 (b) ->  0  0  7
 4 (a) ->  0  0  8 (b) ->  0  0  9
 5 (a) ->  0  0 10 (b) ->  0  0 11
 6 (a) ->  0  0 12 (b) ->  0  0 13
 7 (a) ->  0  0 14 (b) ->  0  0 15
 8 (a) ->  0  0 16 (b) ->  0  0 17
 9 (a) ->  0  1  0 (b) ->  0  1  1
10 (a) ->  0  1  2 (b) ->  0  1  3
11 (a) ->  0  1  4 (b) ->  0  1  5
12 (a) ->  0  1  6 (b) ->  0  1  7
13 (a) ->  0  1  8 (b) ->  0  1  9
14 (a) ->  0  1 10 (b) ->  0  1 11
15 (a) ->  0  1 12 (b) ->  0  1 13
16 (a) ->  0  1 14 (b) ->  0  1 15
17 (a) ->  0  1 16 (b) ->  0  1 17
18 (a) ->  1  0  0 (b) ->  1  0  1

我是一个关心未定义的行为性质:

if ((sector = (++sector % 18)) == 0)

构造,更喜欢这样的东西:

if ((sector = (sector + 1) % 18)) == 0)

但是,如果它给了你正确的价值观,那应该没问题。但是,您需要检查它是否在您运行的环境中为您提供了正确的值事实上,它在我的gcc版本中确实存在,但这并不意味着它在你的情况下会存在。

或者,您可以使用上面定义了的建议形式。

你所拥有的故障点远未达到头部或圆柱体之间的切换,所以我不认为这是包装问题,但如果可能的话,你应该在你的环境中打印出值。

当你说你"不能读过第四个扇区"时,你应该准确地指定这意味着什么?机器会冻结吗?你会收到磁盘错误吗?它会返回你认为是垃圾的东西吗?

磁盘有可能没有正确格式化,或者有故障,也有可能只是没有您期望看到的数据。用DOS/Windows/任何东西格式化软盘并检查它在程序中的作用可能是值得的。

相关内容

  • 没有找到相关文章

最新更新