[SECTION .s16] [BITS 16] LABEL_BEGIN: mov ax, cs mov ds, ax mov es, ax mov ss, ax mov sp, 0100h ; 初始化 32 位代碼段描述符 xor eax, eax mov ax, cs shl eax, 4 add eax, LABEL_SEG_CODE32 mov word [LABEL_DESC_CODE32 + 2], ax shr eax, 16 mov byte [LABEL_DESC_CODE32 + 4], al mov byte [LABEL_DESC_CODE32 + 7], ah ; 爲加載 GDTR 做準備 xor eax, eax mov ax, ds shl eax, 4 add eax, LABEL_GDT ; eax <- gdt 基地址 mov dword [GdtPtr + 2], eax ; [GdtPtr + 2] <- gdt 基地址 ; 加載 GDTR lgdt [GdtPtr] ; 關中斷 cli ; 打開地址線A20 in al, 92h or al, 00000010b out 92h, al ; 準備切換到保護模式 mov eax, cr0 or eax, 1 mov cr0, eax ; 真正進入保護模式 jmp dword SelectorCode32:0 ; 執行這一句會把 SelectorCode32 裝入 cs, ; 並跳轉到 Code32Selector:0 處 ; END of [SECTION .s16] [SECTION .s32]; 32 位代碼段. 由實模式跳入. [BITS 32] LABEL_SEG_CODE32: mov ax, SelectorVideo mov gs, ax ; 視頻段選擇子(目的) mov edi, (80 * 11 + 79) * 2 ; 屏幕第 11 行, 第 79 列。 mov ah, 0Ch ; 0000: 黑底 1100: 紅字 mov al, 'P' mov [gs:edi], ax ; 到此中止 jmp $ SegCode32Len equ $ - LABEL_SEG_CODE32 ; END of [SECTION .s32]
;---------------------------------------------------------------------------- ; 在下列類型值命名中: ; DA_ : Descriptor Attribute ; D : 數據段 ; C : 代碼段 ; S : 系統段 ; R : 只讀 ; RW : 讀寫 ; A : 已訪問 ; 其它 : 可按照字面意思理解 ;---------------------------------------------------------------------------- ; 描述符類型 DA_32 EQU 4000h ; 32 位段 DA_DPL0 EQU 00h ; DPL = 0 DA_DPL1 EQU 20h ; DPL = 1 DA_DPL2 EQU 40h ; DPL = 2 DA_DPL3 EQU 60h ; DPL = 3 ; 存儲段描述符類型 DA_DR EQU 90h ; 存在的只讀數據段類型值 DA_DRW EQU 92h ; 存在的可讀寫數據段屬性值 DA_DRWA EQU 93h ; 存在的已訪問可讀寫數據段類型值 DA_C EQU 98h ; 存在的只執行代碼段屬性值 DA_CR EQU 9Ah ; 存在的可執行可讀代碼段屬性值 DA_CCO EQU 9Ch ; 存在的只執行一致代碼段屬性值 DA_CCOR EQU 9Eh ; 存在的可執行可讀一致代碼段屬性值 ; 系統段描述符類型 DA_LDT EQU 82h ; 局部描述符表段類型值 DA_TaskGate EQU 85h ; 任務門類型值 DA_386TSS EQU 89h ; 可用 386 任務狀態段類型值 DA_386CGate EQU 8Ch ; 386 調用門類型值 DA_386IGate EQU 8Eh ; 386 中斷門類型值 DA_386TGate EQU 8Fh ; 386 陷阱門類型值 ; 選擇子圖示: ; ┏━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┓ ; ┃ 15 ┃ 14 ┃ 13 ┃ 12 ┃ 11 ┃ 10 ┃ 9 ┃ 8 ┃ 7 ┃ 6 ┃ 5 ┃ 4 ┃ 3 ┃ 2 ┃ 1 ┃ 0 ┃ ; ┣━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━╋━━╋━━┻━━┫ ; ┃ 描述符索引 ┃ TI ┃ RPL ┃ ; ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━┻━━━━━┛ ; ; RPL(Requested Privilege Level): 請求特權級,用於特權檢查。 ; ; TI(Table Indicator): 引用描述符表指示位 ; TI=0 指示從全局描述符表GDT中讀取描述符; ; TI=1 指示從局部描述符表LDT中讀取描述符。 ; ;---------------------------------------------------------------------------- ; 選擇子類型值說明 ; 其中: ; SA_ : Selector Attribute SA_RPL0 EQU 0 ; ┓ SA_RPL1 EQU 1 ; ┣ RPL SA_RPL2 EQU 2 ; ┃ SA_RPL3 EQU 3 ; ┛ SA_TIG EQU 0 ; ┓TI SA_TIL EQU 4 ; ┛ ;---------------------------------------------------------------------------- ; 宏 ------------------------------------------------------------------------------------------------------ ; ; 描述符 ; usage: Descriptor Base, Limit, Attr ; Base: dd ; Limit: dd (low 20 bits available) ; Attr: dw (lower 4 bits of higher byte are always 0) %macro Descriptor 3 dw %2 & 0FFFFh ; 段界限1 dw %1 & 0FFFFh ; 段基址1 db (%1 >> 16) & 0FFh ; 段基址2 dw ((%2 >> 8) & 0F00h) | (%3 & 0F0FFh) ; 屬性1 + 段界限2 + 屬性2 db (%1 >> 24) & 0FFh ; 段基址3 %endmacro ; 共 8 字節 ; ; 門 ; usage: Gate Selector, Offset, DCount, Attr ; Selector: dw ; Offset: dd ; DCount: db ; Attr: db %macro Gate 4 dw (%2 & 0FFFFh) ; 偏移1 dw %1 ; 選擇子 dw (%3 & 1Fh) | ((%4 << 8) & 0FF00h) ; 屬性 dw ((%2 >> 16) & 0FFFFh) ; 偏移2 %endmacro ; 共 8 字節 ; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^