我需要从操作系统状态前读取软盘,并且我有一个读取功能,但它似乎无法读取第4个扇区......
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);
}
知道为什么吗?我是否错误地从块转换?
答案 0 :(得分:1)
不,假设您的磁盘是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 %2d\n", 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)
但是,如果它给你正确的值,它应该没问题。但是,您需要检查 在您正在运行的环境中为您提供正确的值。它在我的{{1}版本中执行的事实并不意味着它会在你的情况下。
或者您可以使用 定义的建议表单。
你所遇到的失败点远不及头部或圆柱体之间的切换,所以我不认为这是一个包装问题,但如果可能的话,你应该打印出你环境中的值。
如果您说“无法读取第4个扇区”,则应指定完全这意味着什么?机器是否会冻结,是否会出现磁盘错误,是否会返回您认为是垃圾的?
磁盘可能没有正确格式化,或者它有问题,也有可能它没有你希望看到的数据。使用DOS / Windows /等格式化软盘可能是值得的,并检查程序中的功能。