Вы используете 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, поэтому вы хотите изменить порядок операндов, потому что похоже, что вы используете NASM из инструкции times
. Имена переменных должны быть понятны.
Если вы разрабатываете ОС для хобби, тогда http://forum.osdev.org/
- хорошее место, чтобы получить поддержку от других, делающих то же самое. Он немного более специализирован, чем stackoverflow, и многие вещи ОС могут быть довольно эзотерическими.