int 0x13
必要な数のセクターをロードし、新しいコードを配置した場所にジャンプするために使用します。第 2 段階で行う必要があることは何もありませんがDS
、コードをロードする場所に対して有効になるように設定する必要があります。
私の小さな OS アーカイブからの例:
/* 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 形式であるため、命令から NASM を使用しているように見えるため、オペランドの順序を逆にする必要がありますtimes
。変数名は一目瞭然です。
趣味の OS を開発している場合http://forum.osdev.org/
は、同じことをしている他の人からサポートを得るのに適した場所です。これは、stackoverflow よりも少し専門的であり、OS の多くは非常に難解です。