0

我指的是 BrokenThorn 的操作系统开发教程,目前正在阅读有关开发加载第二阶段的完整第一阶段引导加载程序的部分 - Bootloaders 4

在将逻辑块地址 (LBA) 转换为气缸盖扇区 (CHS) 格式的部分中,这是使用的代码 -

LBACHS:
      xor     dx, dx                              ; prepare dx:ax for operation
      div     WORD [bpbSectorsPerTrack]           ; divide by sectors per track
      inc     dl                                  ; add 1 (obsolute sector formula)
      mov     BYTE [absoluteSector], dl
      xor     dx, dx                              ; prepare dx:ax for operation
      div     WORD [bpbHeadsPerCylinder]          ; mod by number of heads (Absolue head formula)
      mov     BYTE [absoluteHead], dl             ; everything else was already done from the first formula

      mov     BYTE [absoluteTrack], al            ; not much else to do :)
      ret

我无法理解这种转换背后的逻辑。我尝试使用一些示例值来遍历它并查看它是如何工作的,但这让我更加困惑。有人可以解释这种转换是如何工作的以及使用的逻辑吗?

4

1 回答 1

1

我猜你的 LBA 值被存储在AX你对某个值执行除法时。

作为一些预先信息,absoluteSector是 CHS 扇区号,absoluteHead是 CHS 磁头号,absoluteTrack是 CHS 柱面号。气缸和履带是完全相同的东西,只是名称不同。

此外,DIV16 位代码的操作将采用DX:AX寄存器组合中的任何内容并将其除以某个值。除法的其余部分将在DX寄存器中,而实际结果将在AX寄存器中。

接下来,*X寄存器是 16 位寄存器,其中*是 之一ABCD。它们由低和高组件组成,分别称为高*H*L低。例如,DX寄存器具有DH高 8 位和DL低 8 位。

最后,BYTEandWORD修饰符只是简单地说明了将被使用/传输的数据的大小。

您必须提取的第一个值是扇区号,它是通过将 LBA 值除以每个磁道的扇区数获得的。然后DL寄存器将包含扇区号减一。这是因为计数扇区从 1 开始,这与大多数从 0 开始的值不同。为了解决这个问题,我们将DL寄存器加一以获得正确的扇区值。该值存储在内存中absoluteSector

您必须提取的下一个值是磁头数,它是通过将最后一次操作的结果除以DIV每个柱面的磁头数获得的。然后DL寄存器将包含头号,我们将其存储在absoluteHead.

最后,我们得到轨道号。通过最后一次除法,我们已经获得了AL寄存器中的值。然后我们将该值存储在absoluteTrack

希望这能澄清一点。

-阿德里安

于 2013-12-04T23:45:41.423 回答