【PCode:】
Gdt gdt={0,0,0};
Gdt gdt_code32={0,code32.length-1,DA_C+DA_32};
Gdt gdt_video={0B8000h,0ffffh,DA_DRW};
Gdt gdts[3]={,,};
Gdtr *gdtPtr={gdts.size-1,0};
Selector selector_code32=gdt_code32.offset;
...
ds=cs;
gdt_code32.base=code32;
gdtr=*gdtPtr;
...
%include "pm.inc"
org 07c00h
jmp main
[SECTION .gdt]
gdt: Descriptor 0,0,0
gdt_code32: Descriptor 0, SegCode32Len - 1, DA_C + DA_32; 非一致代码段
gdt_video: Descriptor 0B8000h, 0ffffh, DA_DRW ; 显存首地址
gdtLen equ $ - gdt ; GDT长度
gdtPtr dw gdtLen - 1 ; GDT界限
dd 0 ; GDT基地址
; GDT 选择子
selector_code32 equ gdt_code32 - gdt
selector_video equ gdt_video - gdt
[SECTION .s16]
[BITS 16]
main:
mov ax, cs
mov ds, ax
xor eax, eax
mov ax, cs
shl eax, 4
add eax, code32
mov word [gdt_code32 + 2], ax
shr eax, 16
mov byte [gdt_code32 + 4], al
mov byte [gdt_code32 + 7], ah
xor eax, eax
mov ax, ds
shl eax, 4
add eax, gdt ; eax <- gdt 基地址
mov dword [gdtPtr+2],eax
lgdt [gdtPtr]
cli
in al, 92h
or al, 00000010b
out 92h, al
mov eax, cr0
or eax, 1
mov cr0, eax
jmp dword selector_code32:0
[SECTION .s32]; 32 位代码段. 由实模式跳入.
[BITS 32]
code32:
mov ax, selector_video
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 $ - code32