我正在使用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
从我对在线资源和线程的阅读中,我发现了这一点:
vwX uYZ
其中XYZ
是一个群集号,uvw
是另一个群号。我有一个问题 - 它代表编号较低的FAT条目,代表较高的?然而,看到代码,我无法理解如何使用上述2个事实(如果假设是正确的)。最初,ax
具有来自根目录的2个字节,并且其低12位可以直接使用。但这还没有完成。另外,如何解析vwX uYZ
格式?
如果有人能够详细解释这一点并指出我所犯的任何错误,那将会非常有帮助
答案 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)