📄 setup.asm
字号:
[BITS 16]
[global begin]
[extern _h_main] ;this is in the c file
begin:
jmp setup
; --------------------------------------------------------------------
; GDT 定义
gdt:
gdt_null:
dd 0
dd 0 ; 空描述符全是0
gdt_code_addr equ $ - gdt ; 代码段在GDT表中的位置
gdt_code:
dw 0xffff ; 段大小为4GB
dw 0x0000 ; 基址的低16位
db 0 ; 基址的高八位
db 10011010b
db 11001111b
db 0
gdt_data_addr equ $ - gdt ; 数据段在GDT表中的位置
gdt_data:
dw 0xffff
dw 0x0000
db 0
db 10010010b
db 11001111b
db 0
gdt_end:
gdt_addr:
dw gdt_end - gdt - 1 ; GDT 表的大小
dd gdt ; GDT 表的位置
; --------------------------------------------------------------------
setup:
xor ax,ax ; 设置 DS
mov ds,ax
cli ; 关中断
lgdt [gdt_addr] ; 载入 GDT 的描述符
mov eax,cr0 ; 下面三句设置 cr0 的第 0 位(PE位)为1,表示进入保护模式
or eax,1
mov cr0,eax
jmp gdt_code_addr:code_32 ; 跳入32位的代码段中,同时设置了CS和IP
[BITS 32]
code_32:
mov ax,gdt_data_addr ; 设置 DS,ES,SS,FS,GS为数据段描述表的位置
mov ds,ax
mov es,ax
mov ss,ax
mov fs,ax
mov gs,ax
mov esp , 0xffff ; 设置堆栈的头指针
call _h_main ;调用C内核主函数地址
hlt ;主函数是不能返回的,如果真的返回了,就到这里死机
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -