Assembly 计算下一个集群

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

最近我读了一些关于OS开发的教程:这是一个很好的OSDev系列

当我想加载引导加载程序的第2阶段时,我很难理解“计算下一个集群”的想法。代码是:

      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感谢您的回复。我努力寻找&我把它找出来。我想我应该为这个做一个教程。鲁尔