Assembly 计算下一个集群
最近我读了一些关于OS开发的教程:这是一个很好的OSDev系列 当我想加载引导加载程序的第2阶段时,我很难理解“计算下一个集群”的想法。代码是:Assembly 计算下一个集群,assembly,x86-16,bootloader,osdev,fat,Assembly,X86 16,Bootloader,Osdev,Fat,最近我读了一些关于OS开发的教程:这是一个很好的OSDev系列 当我想加载引导加载程序的第2阶段时,我很难理解“计算下一个集群”的想法。代码是: mov ax, WORD [cluster] ; The current Cluster. mov cx, ax ; copy current cluster mov dx, ax ; copy current cluster
mov ax, WORD [cluster] ; The current Cluster.
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
jz .EVEN_CLUSTER
mov bx, [FAT address] ; Strat address of FAT table
mov ax, [cluster] ;the index (for ex: 4)
mov dx, ax ; make copy of index
shr dx, 0x0001 ; divide it By 2.
add ax, dx ; index/2 + index = index * 3/2.
add bx, ax ;Start address + index = the next Entry (cluster).
为什么我们要将当前的集群号乘以3/2来获得下一个集群号?这种奇怪的情况是FAT12文件系统特有的 由于FAT12中集群的记录大小为12位,为了计算其在文件分配表中的偏移量(以字节为单位),您需要获取其索引并将其乘以3/2(或12位/8位)
集群记录包含文件的下一个集群的编号(如链表中的指针)或文件结束标记。对于空闲群集,群集记录可能会标记为坏群集或只是空闲的群集。这种奇怪的特性是FAT12文件系统特有的 由于FAT12中集群的记录大小为12位,为了计算其在文件分配表中的偏移量(以字节为单位),您需要获取其索引并将其乘以3/2(或12位/8位)
集群记录包含文件的下一个集群的编号(如链表中的指针)或文件结束标记。对于空闲群集,群集记录可能会标记为坏群集或只是空闲群集。我在assembly标记中找到了相同的问题,但我找不到它来引用它!!(非常有用)对不起 那么,为什么我们将索引乘以3/2来得到下一个集群的索引呢 首先,我们需要澄清一些想法: 肥胖表中的愤怒是什么??
是12位长内存的和平。因此,FAT表是这些项的集合。 此条目中有什么内容?? 在内存的平静中有一个索引(数字),该索引引用同一FAT表中的一个条目(FAT起始地址中有多少条目)。
每个条目的长度为12位:
<---- 12 bits ----><---- 12 bits ----><---- 12 bits ----><---- 12 bits ---->
1st index 2nd index 3rd index 4th index
简单:-)
但是3/2分数在哪里呢-D.上面的代码是错误的,为什么
逻辑是正确的,但存在对“寻址单元”的误解。
在大多数CPU中,单元寻址是字节(8位),因此当我们制作[index]时,这意味着:索引*内存中的8位。 因此,当我们制作[cluster]-->索引*8位时,我们将像这样索引8位长的条目。
与此相反,我们的索引是12位而不是8位!!!那么,如何解决这个大问题呢??
解决方案: 我们应该将[cluster]乘以3/2,因此:
索引*8位*3/2=索引*12位。这就是我们需要的!!现在我们可以按12位单位(1.5字节)索引内存。
正确的代码是:
mov ax, WORD [cluster] ; The current Cluster.
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
jz .EVEN_CLUSTER
mov bx, [FAT address] ; Strat address of FAT table
mov ax, [cluster] ;the index (for ex: 4)
mov dx, ax ; make copy of index
shr dx, 0x0001 ; divide it By 2.
add ax, dx ; index/2 + index = index * 3/2.
add bx, ax ;Start address + index = the next Entry (cluster).
我是新手,所以如果有什么问题就通知它-D谢谢。我在assembly标签中找到了相同的问题,但我找不到它来引用它!!(非常有用)对不起 那么,为什么我们将索引乘以3/2来得到下一个集群的索引呢 首先,我们需要澄清一些想法: 肥胖表中的愤怒是什么??
是12位长内存的和平。因此,FAT表是这些项的集合。 此条目中有什么内容?? 在内存的平静中有一个索引(数字),该索引引用同一FAT表中的一个条目(FAT起始地址中有多少条目)。
每个条目的长度为12位:
<---- 12 bits ----><---- 12 bits ----><---- 12 bits ----><---- 12 bits ---->
1st index 2nd index 3rd index 4th index
简单:-)
但是3/2分数在哪里呢-D.上面的代码是错误的,为什么
逻辑是正确的,但存在对“寻址单元”的误解。
在大多数CPU中,单元寻址是字节(8位),因此当我们制作[index]时,这意味着:索引*内存中的8位。 因此,当我们制作[cluster]-->索引*8位时,我们将像这样索引8位长的条目。
与此相反,我们的索引是12位而不是8位!!!那么,如何解决这个大问题呢??
解决方案: 我们应该将[cluster]乘以3/2,因此:
索引*8位*3/2=索引*12位。这就是我们需要的!!现在我们可以按12位单位(1.5字节)索引内存。
正确的代码是:
mov ax, WORD [cluster] ; The current Cluster.
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
jz .EVEN_CLUSTER
mov bx, [FAT address] ; Strat address of FAT table
mov ax, [cluster] ;the index (for ex: 4)
mov dx, ax ; make copy of index
shr dx, 0x0001 ; divide it By 2.
add ax, dx ; index/2 + index = index * 3/2.
add bx, ax ;Start address + index = the next Entry (cluster).
我是新手,所以如果有什么问题就通知它-D谢谢。记住这是FAT12:每个集群是12位。因为一个字节是8位,所以一个条目是一个字节半,或3/2字节 记住这是FAT12:每个集群是12位。因为一个字节是8位,所以一个条目是一个字节半,或3/2字节 谢谢你的回复。我努力寻找&我把它找出来。我想我应该为这个做一个教程。loolThanks EarlGray感谢您的回复。我努力寻找&我把它找出来。我想我应该为这个做一个教程。鲁尔