내 CPU가 리틀 엔디안이며 문서에서 FAT 사양의 바이트 순서를 준수한다고 말합니다. 그렇다면 왜 BS_jmpBoot에 대해 유효한 주소를 얻고 있습니까? 첫 번째 섹터의 바이트 0-3은 유효하지만 첫 번째 섹터의 바이트 11-12는 BPB_BytesPerSec에 유효한 번호가 아닙니다.FAT BPB 및 리틀 엔디안 반전
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 = 0000
를 산출나는 모든 기계에서 쓰고있는 공간을 알고 싶어하기 때문에 공간을 할당하기 위해 char 배열을 사용하고 싶다. 또는하지 않아야합니까?
다시 한번 감사드립니다! 모든
'read (fd, BS_jmpBoot, 3);'read (fd, BS_jmpBoot, 4);'BTW, ** 무엇이'BS_jmpBoot'입니까? – wildplasser
@wildplasser - 예전의 플로피 디스크에서는 부트 섹터에 16 비트 8086 기계 코드의 DOS 용 실행 코드가 포함될 수 있습니다. 그 말 그대로 RAM에 부팅 섹터의 시작으로 점프로 실행되었습니다. 그러나 부트 섹터의 시작 부분에 디스크 포맷을 설명하는 예약 된 필드가 있습니다 - DOS 버전에 따라 512 바이트 중 약 64 바이트까지 - 그래서 처음 3 바이트는 실제 실행 코드에 대한 점프 명령을 위해 예약되었습니다. – Steve314
나는 BS_jmpBoot에 대한 정의가 없다는 것을 언급하고 있었다. 그러나 (IMHO 올바른 방법은 한 번의 스윕에서 전체 512 바이트 섹터를 읽은 다음 정확한 조각을 선택하는 것이다. – wildplasser