![](https://csdnimg.cn/release/download_crawler_static/2842832/bg8.jpg)
mov byte [LABEL_DESC_CODE32 + 4], al
mov byte [LABEL_DESC_CODE32 + 7], ah
; 为加载 GDTR 作准备
mov eax, LABEL_GDT
mov dword [GdtPtr + 2], eax ;得到 GDT 基地址
; 加载 全局描述符的信息结构体 到 GDTR
lgdt [GdtPtr]
CA20 ;利用键盘端口打开 A20 地址线
; 将 CRO 的 PE 位 也就是 0 位 置 1 那么就进入 386 模式了
mov eax, cr0
or eax, 1
mov cr0, eax
jmp dword SelectorCode32:0 ;
;执行这一句会把 SelectorCode32 装入 cs, 并跳转到 Code32Selector:0 处
;这个描述符集合是以一个空描述符开始得,现在 LABEL_DESC_CODE32 描述符的索引值因该是 8,
;所以 SelectorCode32 的值应该就是 LABEL_DESC_CODE32 的索引值,Code32Selector:0 当中的 0 是指
LABEL_DESC_CODE32 的段基址+ 0
;那么在打开 cr0 的 PE 位后,这个 JMP 指令不再是直接跳到段地址去了;
;而是去 GDTR 全局描述符寄存器当中去找这个当前 CS 的索引,当前段基址+偏移 的内存地址了。
[SECTION .s32]; 32 位代码段. 由实模式跳入.
[BITS 32]
LABEL_CODE32:
;保护模式的死循环
mov ax, SelectorVideo
mov gs, ax ; 视频段选择子(目的)
mov edi, (80 * 10 + 9) * 2 ; 屏幕第 10 行, 第 0 列。
mov ah, 1Ch ; 0000: 黑底 1100: 红字
mov esi,0
mov ds,SelectData
mov ecx,11
vi:
lodsb
mov [gs:edi], ax
inc edi
LOOPNZ vi
; 到此停止
jmp $
SegCode32Len equ $ - LABEL_CODE32
[SECTION .data] ;数据段
strHello: db "Hello World"
SegDataLen equ $- strHello