获取FAT12中的下一个群集号

时间:2013-12-12 17:56:37

标签: assembly operating-system x86 bootloader fat

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

      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条目,代表较高的?
  3. 然而,看到代码,我无法理解如何使用上述2个事实(如果假设是正确的)。最初,ax具有来自根目录的2个字节,并且其低12位可以直接使用。但这还没有完成。另外,如何解析vwX uYZ格式?

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

2 个答案:

答案 0 :(得分:1)

起始簇号用作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

答案 1 :(得分: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)