|
发表于 2013-9-3 13:11:25
|
显示全部楼层
org 07c00h
jmp main
gdt_null:
dd 0
dd 0
gdt_code_addr equ $ - gdt_null ; 求得代码段在GDT表中的位置
gdt_code:
dw 0ffffh ; 段大小为4GB
dw 0 ; 基地址(24位)
db 0
db 10011010b ; 属性描述位,指明此是代码段,可读可执行
db 11001111b ; 具体的每一位是代表什么可查Intel CPU编程手册
db 0
gdt_data_addr equ $ - gdt_null ; 求得数据段在GDT表中的位置
gdt_data:
dw 0ffffh
dw 0
db 0
db 10010010b ; 指明此是数据段,可读可写
db 11001111b
db 0
gdt_addr:
dw gdt_addr - gdt_null ; GDT 表的大小
dd gdt_null ; GDT 表的位置
; ---------------------------------------------------------------------------
[BITS 16]
main: ; 引导程序从此处开始执行
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov sp,0100h
lgdt [gdt_addr] ; 载入 GDT 的描述符
;关中断
cli
;打开地址A20
in al,92h
or al,00000010b
out 92h,al
mov eax , cr0 ; 下面三句设置 cr0 的第 0 位(PE位)为1,
; 表示进入保护模式
or eax , 1
mov cr0 , eax
jmp gdt_code_addr:code_32 ; 跳入32位的代码段中
[BITS 32]
code_32:
mov ax , gdt_data_addr ; 以下三句设置 DS,ES,SS,FS,GS
; 为数据段描述表的位置
times 510-($-$$) db 0
dw 0xaa55;结束标志 |
|