书上说得很明白,无需赘言。
简单的一一对应的映射的代码如下:
- %include "pm.inc"
- org 0100h
- jmp LABEL_BEGIN
- [section .gdt]
- LABEL_DESC_DUMMY:
- Descriptor 0,0,0
- LABEL_DESC_CODE32:
- Descriptor 0,Code32_Len - 1,DA_C + DA_32
- LABEL_DESC_CODE16:
- Descriptor 0,Code16_Len - 1,DA_C
- LABEL_DESC_VIDEO:
- Descriptor 0b8000h,0ffffh,DA_DRW
- LABEL_DESC_NORMAL:
- Descriptor 0,0ffffh,DA_DRW
- LABEL_DESC_DIR_BASE:
- Descriptor 200000h,4095,DA_DRW
- LABEL_DESC_TBL_BASE:
- Descriptor 201000h,1023,DA_DRW + DA_LIMIT4K
- GDT_Len equ $ - LABEL_DESC_DUMMY
- GDT_Ptr:
- dw GDT_Len - 1
- dd 0
- Selector_Code32 equ LABEL_DESC_CODE32 - LABEL_DESC_DUMMY
- Selector_Code16 equ LABEL_DESC_CODE16 - LABEL_DESC_DUMMY
- Selector_Video equ LABEL_DESC_VIDEO - LABEL_DESC_DUMMY
- Selector_Normal equ LABEL_DESC_NORMAL - LABEL_DESC_DUMMY
- Selector_Dir_Base equ LABEL_DESC_DIR_BASE - LABEL_DESC_DUMMY
- Selector_Tbl_Base equ LABEL_DESC_TBL_BASE - LABEL_DESC_DUMMY
- [section .s16]
- [bits 16]
- LABEL_BEGIN:
- mov ax,cs
- mov ds,ax
- mov es,ax
- mov [LABEL_GO_BACK_TO_REAL + 3],ax
- Fill_Descriptor LABEL_DESC_CODE32,LABEL_CODE32
- Fill_Descriptor LABEL_DESC_CODE16,LABEL_BEGIN
- xor eax,eax
- mov ax,ds
- shl eax,4
- add eax,LABEL_DESC_DUMMY
- mov dword [GDT_Ptr + 2],eax
- lgdt [GDT_Ptr]
- cli
- in al,92h
- or al,00000010b
- out 92h,al
- mov eax,cr0
- or al,1
- mov cr0,eax
- jmp Selector_Code32:0
- _LABEL_PREPARE_GO_BACK_TO_REAL:
- LABEL_PREPARE_GO_BACK_TO_REAL equ _LABEL_PREPARE_GO_BACK_TO_REAL - $$
- mov ax,Selector_Normal
- mov ds,ax
- mov es,ax
- mov gs,ax
- mov fs,ax
- mov eax,cr0
- and al,11111110b
- mov cr0,eax
- LABEL_GO_BACK_TO_REAL:
- jmp 0:LABEL_ALREADY_REAL
- LABEL_ALREADY_REAL:
- in al,92h
- and al,11111101b
- out 92h,al
- sti
- mov ax,4c00h
- int 21h
- Code16_Len equ $ -$$
- [section .s32]
- [bits 32]
- LABEL_CODE32:
- mov ax,Selector_Dir_Base
- mov es,ax
- xor edi,edi
- cld
- mov ecx,1024
- mov eax,201000h + 7h
- .1:
- stosd
- add eax,4096
- loop .1
- mov ax,Selector_Tbl_Base
- mov es,ax
- xor edi,edi
- mov ecx,1024 * 1024
- mov eax,7h
- .2:
- stosd
- add eax,4096
- loop .2
- mov eax,200000h
- mov cr3,eax
- mov eax,cr0
- or eax,80000000h
- mov cr0,eax
- mov ax,Selector_Video
- mov gs,ax
- mov ah,0ch
- mov al,'x'
- mov [gs:80 * 10],ax
- jmp Selector_Code16:LABEL_PREPARE_GO_BACK_TO_REAL
- Code32_Len equ $ - $$
结果如下: