您用于int 0x13
加载所需数量的扇区并跳转到您放置新代码的位置。在第二阶段您不需要做任何事情,但您需要确保设置DS
为对加载代码的任何位置都有效。
我的小操作系统档案中的示例:
/* BIOS loads the sectors into es:bx */
pushw $STAGE1_WORKSEG
popw %es
movw $STAGE1_OFFSET, %bx
read_stage1:
/* Try to read in a few sectors */
movb $0x2, %cl /* Sector */
movb $0x0, %ch /* Cylinder */
movb $0x0, %dh /* Head */
movb $0x0, %dl /* Drive */
movb $0x2, %ah /* BIOS read function */
/* How many sectors to load */
movb $STAGE1_SIZE, %al
int $0x13
jnc read_stage1_done
/* Reset drive */
xorw %ax, %ax
int $0x13
jmp read_stage1
read_stage1_done:
/* Perform a long jump into stage1 */
ljmp $STAGE1_WORKSEG, $STAGE1_OFFSET
call halt
halt:
/*
* Function: halt
* Synopsis: Sends the processor into a permanent halted status
* Notes:
* The only way out of this is to manually reboot
*/
hlt /* Halt the processor */
jmp halt
这是 GAS 格式,因此您需要反转操作数顺序,因为看起来您正在使用times
指令中的 NASM。变量名称应该是不言自明的。
如果您正在开发一个爱好操作系统,那么http://forum.osdev.org/
这是获得其他人做同样事情的支持的好地方。它比 stackoverflow 更专业一些,而且很多操作系统的东西都非常深奥。