1

我正在使用 BrokenThorn 的操作系统开发教程。我的困惑在于这段代码,它负责读取文件的下一个簇号:

      mov     ax, WORD [cluster]  ; identify current cluster from FAT

 ; is the cluster odd or even? Just divide it by 2 and test!

      mov     cx, ax              ; copy current cluster
      mov     dx, ax              ; copy current cluster
      shr     dx, 0x0001          ; divide by two
      add     cx, dx              ; sum for (3/2)

      mov     bx, 0x0200          ; location of FAT in memory
      add     bx, cx              ; index into FAT
      mov     dx, WORD [bx]       ; read two bytes from FAT

      test    ax, 0x0001
      jnz     .ODD_CLUSTER

根据我对在线资源和线程的阅读,这是我发现的:

  1. 文件根目录条目中的第一个簇号为 2 个字节。对于 FAT12,仅使用这 2 个字节的低 12 位。
  2. FAT12 的 FAT 以下列格式存储: vwX uYZ其中XYZ是一个簇号,uvw另一个是簇号。我对此有一个问题 - 哪个代表编号较低的 FAT 条目,哪个代表更高?

但是,看到代码,我无法理解上述两个事实(如果假设是正确的)是如何被使用的。最初,ax具有根目录的 2 个字节,其低 12 位可以直接使用。但这还没有完成。另外,这里的vwX uYZ格式是如何解析的?

如果有人可以详细解释这一点并指出我所犯的任何错误,那将非常有帮助

4

2 回答 2

2

起始簇号用作 FAT 的索引。由于是FAT12,每2个簇对应3个字节。

ax 有根目录的 2 个字节,它的低 12 位可以直接使用。但这还没有完成。

使用了整个 16 位的 ax。由于 ax 的高 4 位将从起始簇号开始为 0,这相当于仅使用低 12 位(除非目录条目损坏,这可能会使您无处索引)。

另外,这里如何解析 vwX uYZ 格式?

最好把vw Xu YZ. 回想一下,x86 是 little-endian。当您在 x86 中读取 2 个字节并将它们存储为vw Xu时,实际读取的数字为Xuvw. 掩码只保留低 12 位,你得到uvw. 同样,当您读取 时Xu YZ,实际读取的数字是YZXu。右移,你得到YZX。顺便说一句,这意味着实际格式可能是vw Zu XY.

于 2013-12-12T20:33:42.953 回答
0

如果您找到一个簇号,例如 10(文件的第一个簇是簇 #10),那么第 10 个 FAT 条目包含该文件的第二个簇号。没有成对的簇号。前面的簇号是表索引。

如果您的文件具有集群 5、7 和 9,则: 第一个集群是您从目录中获得的 #5。

FAT 看起来像(X = 无关,属于其他文件):

X (index = 0)
X
X
X
X
7 (index = 5)
X
9 (index = 7)
X
0xFFF (index = 9; enf of file marker)
于 2013-12-12T20:15:29.793 回答