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 short に書き込むことで機能するようになりましたが (ちょっと)、これが機能しなかった理由を知りたいです:

            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;
...

最初の 2 つのフィールドはバイトであるため、エンディアンは関係ありません (私はそう思います)。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このように正しく読み取る必要があります。

于 2014-11-26T21:20:26.793 に答える
2

まず、この行:

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

ビッグエンディアン形式で値を出力しています。ここに表示される場合0x0002、実際の値は0x0200リトル エンディアンになります。

BS_jmpBoot値については、このサイトによると:

最初の 3 バイト EB 3C と 90 は JMP SHORT 3C NOP に逆アセンブルされます。(3C の値は異なる場合があります。) これは、ディスクのフォーマット情報 (BPB と EBPB) を飛び越えるためです。ディスクの最初のセクターは RAM の 0x0000:0x7c00 にロードされて実行されるため、このジャンプがなければ、プロセッサはコードではないデータを実行しようとします。

つまり、最初の 3 バイトは、1 つのリトルエンディアン値ではなく、3 つの別個のバイトであるオペコードです。

于 2014-11-26T21:16:50.143 に答える