Assembly 使用int 13h功能8读取每个气缸的缸盖

Assembly 使用int 13h功能8读取每个气缸的缸盖,assembly,x86,bootloader,Assembly,X86,Bootloader,我试图理解如何使用int 13h函数8获得“每个气缸的缸盖” 维基百科说 DH=头的逻辑最后一个索引=数量_为-1(因为索引以0开头) 这是“每个气缸的缸盖”还是缸盖总数?(该值+1以获得的数量) 我目前假设它是“每个气缸的缸盖”,并使用以下公式: C = LBA ÷ (HPC × SPT) H = (LBA ÷ SPT) mod HPC S = (LBA mod SPT) + 1 我正在使用int 13h函数2从磁盘读取扇区。通过使用从功能8获取的SPT(63)和HPC(16),我能够读取2

我试图理解如何使用int 13h函数8获得“每个气缸的缸盖”

维基百科说

DH=头的逻辑最后一个索引=数量_为-1(因为索引以0开头)

这是“每个气缸的缸盖”还是缸盖总数?(该值+1以获得的数量)

我目前假设它是“每个气缸的缸盖”,并使用以下公式:

C = LBA ÷ (HPC × SPT)
H = (LBA ÷ SPT) mod HPC
S = (LBA mod SPT) + 1
我正在使用int 13h函数2从磁盘读取扇区。通过使用从功能8获取的SPT(63)和HPC(16),我能够读取2015个扇区或更少扇区的磁盘。当我要求柱面值为2时,它将不起作用,除非我从具有最小3024个扇区的磁盘读取数据。但是,我能够通过磁道边界读取2015年以上的扇区,使用的磁盘扇区数少于3024个。只有当我手动指定柱面2时,它才要求磁盘至少为3024个扇区

这就是为什么我认为这与错误的HPC值有关。 它是一个引导加载程序,并在实模式下运行


什么想法?

它不能直接回答你的问题,但是如果你不使用软盘驱动器(谁是?),那么考虑切换到LBA函数,忘掉这个过时的混乱:DH将包含每个汽缸的磁头数。我希望您知道,当涉及到柱面(int13h/ah=2和ah=8)时,柱面是10位的值。(0至1023)。底部的8位在CH中,顶部的2位在CL中是顶部的2位。谢谢,是的,我知道这一点。DH包含0xff,添加1以获得正确的HPC是正确的吗?0xff的值为255表示每个气缸256个缸盖(0xff+1),您不需要使用INT 13h/08h。它对于软盘驱动器不可靠,您需要检查媒体本身所说的是什么格式,对于硬盘来说是不必要的,因为Jester建议您可以使用LBA寻址。它不会直接回答您的问题,但如果您不使用软盘驱动器(谁是?)然后考虑切换到LBA函数,忘掉这个过时的混乱:DH将包含每个气缸的磁头数。我希望您知道,当涉及到柱面(int13h/ah=2和ah=8)时,柱面是10位的值。(0至1023)。底部的8位在CH中,顶部的2位在CL中是顶部的2位。谢谢,是的,我知道这一点。DH包含0xff,添加1以获得正确的HPC是正确的吗?0xff的值为255表示每个气缸256个缸盖(0xff+1),您不需要使用INT 13h/08h。软盘驱动器不可靠,您需要检查媒体本身的格式,硬盘不需要,因为Jester建议您可以使用LBA寻址。