Я пытаюсь создать свою собственную операционную систему, и теперь я пытаюсь переключиться в 32-битный защищенный режим. Эмулятор падает, когда достигает определенной точки в коде. Пожалуйста, помогите.
Bootsector.asm
KERNEL_OFFSET equ 0x1000
mov [BOOT_DRIVE], dl
mov bp, 0x9000
mov sp, bp
;call print_string1
call start1
start2:
mov bp, 0x9000
mov sp, bp
call disk_load
call switch_to_pm
mov ah, 0
int 0x10
mov ax, 0
int 0x16
jmp $
%include "boot/print.asm"
%include "boot/print_hex.asm"
%include "boot/disk.asm"
%include "boot/gdt.asm"
%include "boot/32bit_print.asm"
%include "boot/switch_pm.asm"
start_os_intro db 'Welcome to DarkraiOS!',0
press_key db '>> Press any key <<',0
[bits 16]
load_kernel:
mov bx, KERNEL_OFFSET
mov dh, 1
mov dl, [BOOT_DRIVE]
jmp start2
start1:
mov ax, 0x0
mov ds, ax
mov es, ax
mov bx,0x8000
mov ah,0 ;clearScreen
int 0x10
mov ah,02 ;big font
int 0x10
Часть bootsector.asm
BEGIN_PM:
mov ebx, start_os_intro
call print_string_pm
call KERNEL_OFFSET
jmp $
switch_pm.asm
switch_to_pm:
mov ah, 0
int 0x10
int 0x16
cli
lgdt [gdt_descriptor]
mov eax, cr0
or eax, 0x1
mov cr0, eax
jmp CODE_SEG:init_pm
[bits 32]
init_pm:
mov ax, DATA_SEG
mov ds, ax
mov ss, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ebp, 0x90000
mov esp, ebp
call BEGIN_PM
Код загрузочного сектораработает нормально, но когда код возвращается к start2 и выполняет disk_load и switch_to_pm. Disk_load работает нормально, но switch_to_pm не работает. код падает после выполнения mov cr0, eax в switch_pm.asm