我的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数组来分配空间,因为我想确定我在任何机器上写的空间;或者我不应该?
再次感谢!
答案 0 :(得分:3)
您正在错误地阅读BPB_BytesPerSec
。 Bpb的结构是(来自here):
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 02
,即小端的0x0200
,您应该正确读取BPB_BytesPerSec
这样的内容。
答案 1 :(得分:2)
首先,这一行:
printf("BPB_BytesPerSec = 0x%02x%02x\n",BPB_BytesPerSec[0], BPB_BytesPerSec[1]);
以big endian格式打印出值。如果它在此处打印0x0002
,则实际值将为小端的0x0200
。
至于BS_jmpBoot
值,根据this site:
前三个字节EB 3C和90反汇编到JMP SHORT 3C NOP。 (3C值可能不同。)原因是跳过磁盘格式信息(BPB和EBPB)。由于磁盘的第一个扇区被加载到位于0x0000:0x7c00的ram并执行,没有这个跳转,处理器将尝试执行不是代码的数据。
换句话说,前3个字节是操作码,它们是三个独立的字节,而不是一个小的字节序值。