FAT BPB и обратный порядок байтов
Мой процессор имеет непосредственный порядок байтов, и, как сказано в документации, он соответствует порядку байтов спецификации 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 - нет. Если бы кто-нибудь мог просветить меня, я был бы очень благодарен.
Спасибо
РЕДАКТИРОВАТЬ: Спасибо за помощь всем, это были мои типы, которые заставили все пойти не так, как надо. Я заставил его работать, записав байты в 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
Я хотел бы использовать массивы символов для выделения места, потому что я хочу быть уверен в том, какое место я пишу на любой машине; или я не должен?
Еще раз спасибо!
2 ответа
Ты читаешь BPB_BytesPerSec
неправильно. Структура Bpb ( отсюда):
BYTE BS_jmpBoot[3];
BYTE BS_OEMName[8];
WORD BPB_BytesPerSec;
...
Первые два поля являются байтами, поэтому их порядковый номер не имеет значения (я думаю). BPB_BytesPerSec
это СЛОВО (при условии 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
как это.
Прежде всего, эта строка:
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 и выполняется без этого перехода, процессор будет пытаться выполнить данные, которые не являются кодом.
Другими словами, первые 3 байта являются кодами операций, которые представляют собой три отдельных байта, а не одно младшее порядковое значение.