2

我的 CPU 是小端,文档告诉我符合 FAT 规范的字节顺序。那么,为什么我获得了 BS_jmpBoot 的有效地址,第一个扇区的字节 0-3,但没有获得 BPB_BytesPerSec 的有效数字,第一个扇区的字节 11-12。

116         int fd = open (diskpath, O_RDONLY, S_IROTH);
117 
118         read (fd, BS_jmpBoot, 3);
119         printf("BS_jmpBoot = 0x%02x%02x%02x\n", BS_jmpBoot[0], S_jmpBoot[1], S_jmpBoot[2]);
120 
121         read (fd, OEMName, 8);
122         OEMName[8] = '\0';
123         printf("OEMName = %s\n", OEMName);
124 
125         read (fd, BPB_BytesPerSec, 2);
126         printf("BPB_BytesPerSec = 0x%02x%02x\n",BPB_BytesPerSec[0], BPB_BytesPerSec[1]);

产量

BS_jmpBoot = 0xeb5890                  //valid address, while 0x9058eb would not be
OEMName = MSDOS5.0
BPB_BytesPerSec = 0x0002               //Should be 0x0200

我想弄清楚为什么 BS_jmpBoot 和 OEMName 打印有效但 BPB_BytesPerSec 没有。如果有人能启发我,我将不胜感激。

谢谢

编辑:感谢大家的帮助,是我的类型让一切都出错了。正如 uesp 所建议的(有点),我通过将字节写入无符号短字节来使其工作,但我仍然想知道为什么这不起作用:

            unsigned char BPB_BytesPerSec[2];
...
125         read (fd, BPB_BytesPerSec, 2);
126         printf("BPB_BytesPerSec = 0x%04x\n", *BPB_BytesPerSec);

产生 BPB_BytesPerSec = 0x0000

我想使用 char 数组来分配空间,因为我想确定我在任何机器上写入的空间;还是我不应该?

再次感谢!

4

2 回答 2

3

你读BPB_BytesPerSec错了。Bpb 的结构是(从这里):

BYTE  BS_jmpBoot[3];
BYTE  BS_OEMName[8];
WORD  BPB_BytesPerSec;
...

前两个字段是字节,因此它们的字节顺序无关紧要(我认为)。BPB_BytesPerSec是一个 WORD(假设 2 个字节),因此您应该像这样定义/读取它:

WORD BPB_BytesPerSec;            //Assuming WORD is defined on your system
read (fd, &BPB_BytesPerSec, 2);
printf("BPB_BytesPerSec = 0x%04x\n", BPB_BytesPerSec); 

因为当你直接读取字节时,你会得到00 020x0200端序的,你应该像这样正确读取BPB_BytesPerSec

于 2014-11-26T21:20:26.793 回答
2

首先,这一行:

printf("BPB_BytesPerSec = 0x%02x%02x\n",BPB_BytesPerSec[0], BPB_BytesPerSec[1]);

正在以大端格式打印值。如果它0x0002在这里打印,实际值将是0x0200小端。

至于BS_jmpBoot价值,根据这个网站

前三个字节 EB 3C 和 90 反汇编为 JMP SHORT 3C NOP。(3C值可能不同。)这是为了跳过磁盘格式信息(BPB和EBPB)。由于磁盘的第一个扇区被加载到位置 0x0000:0x7c00 的 ram 中并被执行,如果没有这个跳转,处理器将尝试执行不是代码的数据。

换句话说,前 3 个字节是操作码,它们是三个单独的字节,而不是一个小端值。

于 2014-11-26T21:16:50.143 回答