以下是一个简单的示例,演示如何将操作系统从实模式切换到保护模式:
[BITS 16]
org 0x7C00
start:
; 设置堆栈指针
xor ax, ax
mov ss, ax
mov sp, 0x7C00
; 切换到保护模式
cli ; 关闭中断
mov ax, cs
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
; 启用保护模式
mov eax, cr0
or eax, 0x1
mov cr0, eax
jmp CODE_SEG:init_protected_mode
CODE_SEG equ 8
DAT_SEG equ 16
use32
init_protected_mode:
mov ax, DAT_SEG
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
mov esp, 0x90000
; 设置GDT
lgdt [GDT_DESCRIPTOR]
; 切换到新的代码段
mov eax, CODE_SEG
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
; 跳转到保护模式代码
jmp CODE_SEG:protected_mode
protected_mode:
; 保护模式下的代码将在这里执行
; 无限循环
jmp $
GDT_DESCRIPTOR:
dw GDT_END - GDT_START - 1
dd GDT_START
GDT_START:
dd 0x0
dd 0x0
db 0x0
db 0x0
db 0x0
CODE_SEG_DESC:
dw 0xFFFF
dw 0x0
db 0x0
db 10011010b
db 11001111b
db 0x0
DAT_SEG_DESC:
dw 0xFFFF
dw 0x0
db 0x0
db 10010010b
db 11001111b
db 0x0
GDT_END:
times 510 - ($-$$) db 0
dw 0xAA55
这段汇编代码将引导扇区设置为保护模式并跳转到保护模式下的代码段。保护模式下的代码可以根据自己的需求进行编写。