The following is a code that transforms from the real model to the protection mode. What books do you need to learn?
; ===========================================; pm.inc;
; ============================================
% Macro Descriptor 3 DW% 2 & 0FFFFH; Segment Direction 1 (2 bytes) DW% 1 & 0FFFFH; Segment Biclings 1 (2 bytes) DB (% 1 >> 16) & 0FFH; Segment Tissing 2 (1 Byte) DW (% 2 >> 8) & 0F00H) | (% 3 & 0F0FFH); attribute 1 segment limit 2 attribute 2 (2 bytes) DB (% 1 >> 24) & 0FFH; Address 3 (1 byte)% endmacro; total 8 bytes
% Macro Gate 4 DW (% 2 & 0FFFH); Offset 1 (2 bytes) DW% 1; Selecton (2 bytes) DW (% 3 & 1FH) | (% 4 << 8) & 0FF00H) ; Property (2 bytes) DW (% 2 >> 16) & 0FFFFH); Offset 2 (2 bytes)% endmacro; total 8 bytes
; ===================================================; PMTEST1.ASM; compilation method : NASM PMTEST1.ASM -O Pmtest1.com; ======================================== ===
% include "pm.inc"; constant, macro, and some instructions
ORG 0100H JMP Label_Begin
[Section .GDT]; GDT; segment base, segment boundary, attribute label_gdt: descriptor 0, 0, 0; empty descriptor label_desc_code32: descriptor 0, segcode32len - 1, da_c da_32; non-uniform code segment, 32LABEL_DESC_VIDEO: Descriptor 0B8000H 0FFFH, DA_DRW; display the first address; GDT end GDTLEN EQU $ - label_gdt; GDT length gdtptr dw gdtlen; GDT limit DD 0; GDT base address
GDT Select Subsence SelectorCode32 Equ Label_Desc_code32 - Label_GdtSelectorVideo EQU Label_Desc_Video - Label_Gdt; End of [Section .GDT]
[Section .s16] [BITS 16] Label_Begin: MOV AX, CS MOV DS, AX MOV ES, AX MOV SS, AX MOV SP, 0100H
; 32-bit initialization code segment 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
To load GDTR, prepare XOR EAX, EAX MOV AX, DS SHL EAX, 4 Add Eax, Label_GDT; EAX <- GDT base address MOV DWORD [GDTPTR 2], EAX; [GDTPTR 2] <- GDT base address
Load GDTR LGDT [GDTPTR]
; Off Interrupt CLI
Open the address line A20 in Al, 92h or Al, 00000010B OUT 92H, Al
Prepare to switch to protect mode MOV Eax, Cr0 or Eax, 1 MOV CR0, EAX
; Really entered the protection mode JMP DWORD selectorcode32: 0; executing this sentence will put the SelectorCode32 into CS and jump to the code32selector: 0; end of [section .s16]
[Section .s32]; 32-bit code segment. Jump in the real mode. [BITS 32]
Label_seg_code32: MOV AX, SelectorVideo Mov GS, AX; video selection sub (purpose)
MOV EDI, (80 * 10 0) * 2; screen 10 line, 0 column. MOV AH, 0CH; 0000: Black bottom 1100: Red word MOV Al, 'P' MOV [GS: EDI], AX
; Here to stop JMP $
Segcode32len EQU $ - Label_SEG_CODE32; End of [Section .s32]