【问题标题】:Getting next cluster number in FAT12获取 FAT12 中的下一个簇号
【发布时间】:2013-12-31 06:59:27
【问题描述】:

我正在使用 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 条目,哪个代表更高?

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

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

【问题讨论】:

    标签: assembly operating-system x86 bootloader fat


    【解决方案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

    【讨论】:

    • 我不认为 vw xu 和 yz 是簇号的字节,因为 vw xu 将是 16 位 - 足以容纳 12 位值。我猜这意味着两个数字,每个数字都有 3 个半字节(十六进制数字)。这就是我所说的“两对”。
    • @turboscrew:这里有误会。 vwZuXY 是磁盘上的 3 个字节,对应于 2 个簇号。读取偶数簇号对应的2个字节后,需要屏蔽掉多余的Z。读取奇数簇号对应的2个字节后,需要右移4位,去掉无关的u
    • 解释得很好。只读一读就帮助我理解了这一点!非常感谢!!
    【解决方案2】:

    如果您找到一个簇号,例如 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-26
      • 2015-05-15
      • 2013-01-24
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 2013-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多