【发布时间】:2012-01-12 18:09:26
【问题描述】:
我目前正在尝试通过学习开源代码来学习如何制作引导加载程序,并最终制作操作系统。我选择的项目是MikeOS:http://mikeos.berlios.de/
在阅读引导加载程序代码时,我卡在代码计算 BIOS INT 13h 调用的 Head/Cylinder/Sector 的部分,试图从磁盘读取根目录。
如果我理解正确的话,根目录从 Sector 19 开始。(Sector 0:引导记录,Sector 1 到 9:FAT12 副本 1,Sector 10 到 18:FAT12 副本 2)所以,我想在调用之后,例程的输出应该是:Head 0, Track 1, Sector 19
但是,当我进行计算时,我在相应的寄存器中获得了 Head 1 (DL)、Track 0 (CH)、Sector 2 (CL)。
我可能做错了,但这些数字是我应该得到的吗?我不质疑代码,因为它是一个工作代码。显然,我缺少一些关于分区表或磁盘寻址的概念。
谁能看到我可能做错了什么,以及如何纠正它?
例程如下图:(cmets由设计者编写)
通话前:
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
【问题讨论】:
标签: assembly x86 interrupt bootstrapping bootloader