gpt4 book ai didi

assembly - 计算 BIOS 中断 13h 的磁头、柱面(磁道)和扇区

转载 作者:行者123 更新时间:2023-12-02 22:12:54 29 4
gpt4 key购买 nike

我目前正在尝试通过研究开源代码来学习如何制作引导加载程序,并最终学习如何制作操作系统。我选择的项目是MikeOS:http://mikeos.berlios.de/

当我阅读引导​​加载程序代码时,我陷入了代码计算 BIOS 的磁头/柱面/扇区 INT 13h 的部分。调用,尝试从磁盘读取根目录。

如果我理解正确的话,根目录从扇区19开始。(扇区0:引导记录,扇区1到9:FAT12副本1,扇区10到18:FAT12副本2)所以,我认为在调用之后,例程的输出应该是:Head 0, Track 1, Sector 19

但是,当我进行计算时,我在相应的寄存器中得到了Head 1(DL),Track 0(CH),Sector 2(CL)。

我可能做错了,但是这些数字是我应该得到的吗?我不质疑代码,因为它是一个工作代码。显然,我缺少一些有关分区表或磁盘寻址的概念。

任何人都可以看到我可能做错了什么,以及如何纠正它?

例程如下:(注释为设计者所写)

通话前:

mov ax, 19                          ; Root dir starts at logical sector 19
<小时/>
12hts:   ; Calculate head, track and sector settings for int 13h
; IN: logical sector in AX, OUT: correct registers for int 13h

push bx
push ax

mov bx, ax ; Save logical sector

mov dx, 0
div word [SectorsPerTrack] ; First the sector
add dl, 01h ; Physical sectors start at 1

mov cl, dl ; Sectors belong in CL for int 13h
mov ax, bx

mov dx, 0 ; Now calculate the head
div word [SectorsPerTrack]
mov dx, 0
div word [Sides]
mov dh, dl ; Head/side
mov ch, al ; Track

pop ax
pop bx

mov dl, byte [bootdev] ; Set correct device

ret
<小时/>
bootdev         db   0   ; Boot device number
SectorPerTrack dw 18 ; Sectors per track (36/cylinder)
Sides dw 2 ; Number of sides/heads

最佳答案

请记住,CHS 内容仅适用于软盘。如今,您将使用 HDD 甚至 USB 设备,并且您的驱动器很可能会被格式化为 FAT32。

此时,您必须使用 LBA 来计算 INT 13h 值:

C = LBA ÷ (HPC × SPT)

H = (LBA ÷ SPT) mod HPC

S = (LBA mod SPT) + 1

例如,扇区 2048(第一个分区很可能位于其中,例如使用 qemu-img)将为 CX = 0x0221(C = 2、S = 21、H = 0)

可悲的是,我花了一段时间才弄清楚这一点。我正在进行 CHS 计算,但得到了错误的值...

关于assembly - 计算 BIOS 中断 13h 的磁头、柱面(磁道)和扇区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8840033/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com