参考于渊的《自己动手写操作系统》第三章中从实模式切换到保护模式,最后有重新
切回实模式的代码(代码如下),其中有几点不太明白的,参考其他文章之后在此记录一下。
其中还有不太明白的地方,希望大家能在下面 留个言帮我讲明白,谢谢。
下面代码有些宏定义没贴出来,应该能看明白。
1
;
==========================================
2 ; pmtest2.asm
3 ; 编译方法:nasm pmtest2.asm - o pmtest2.com
4 ; ==========================================
5
6 % include " pm.inc " ; 常量, 宏, 以及一些说明
7
8 org 0100h
9 jmp LABEL_BEGIN
10
11 [SECTION .gdt]
12 ; GDT
13 ; 段基址, 段界限 , 属性
14 LABEL_GDT: Descriptor 0 , 0 , 0 ; 空描述符
15 LABEL_DESC_NORMAL: Descriptor 0 , 0ffffh, DA_DRW ; *** 注意此处为Normal 描述符 *****
16 LABEL_DESC_CODE32: Descriptor 0 , SegCode32Len - 1 , DA_C + DA_32 ; 非一致代码段, 32
17 LABEL_DESC_CODE16: Descriptor 0 , 0ffffh, DA_C ; 非一致代码段, 16
18 LABEL_DESC_DATA: Descriptor 0 , DataLen - 1 , DA_DRW ; Data
19 LABEL_DESC_STACK: Descriptor 0 , TopOfStack, DA_DRWA + DA_32 ; Stack, 32 位
20 LABEL_DESC_TEST: Descriptor 0500000h, 0ffffh, DA_DRW
21 LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRW ; 显存首地址
22 ; GDT 结束
23
24 GdtLen equ $ - LABEL_GDT ; GDT长度
25 GdtPtr dw GdtLen - 1 ; GDT界限
26 dd 0 ; GDT基地址
27
28 ; GDT 选择子
29 SelectorNormal equ LABEL_DESC_NORMAL - LABEL_GDT
30 SelectorCode32 equ LABEL_DESC_CODE32 - LABEL_GDT
31 SelectorCode16 equ LABEL_DESC_CODE16 - LABEL_GDT
32 SelectorData equ LABEL_DESC_DATA - LABEL_GDT
33 SelectorStack equ LABEL_DESC_STACK - LABEL_GDT
34 SelectorTest equ LABEL_DESC_TEST - LABEL_GDT
35 SelectorVideo equ LABEL_DESC_VIDEO - LABEL_GDT
36 ; END of [SECTION .gdt]
37
38 [SECTION .data1] ; 数据段
39 ALIGN 32
40 [BITS 32 ]
41 LABEL_DATA:
42 SPValueInRealMode dw 0
43 ; 字符串
44 PMMessage: db " In Protect Mode now. ^-^ " , 0 ; 进入保护模式后显示此字符串
45 OffsetPMMessage equ PMMessage - $$ ; 字符串PMMessage相对于LABEL_DATA的偏移,相对于数据段的偏移
46 StrTest: db " ABCDEFGHIJKLMNOPQRSTUVWXYZ " , 0
47 OffsetStrTest equ StrTest - $$
48 DataLen equ $ - LABEL_DATA
49 ; END of [SECTION .data1]
50
2 ; pmtest2.asm
3 ; 编译方法:nasm pmtest2.asm - o pmtest2.com
4 ; ==========================================
5
6 % include " pm.inc " ; 常量, 宏, 以及一些说明
7
8 org 0100h
9 jmp LABEL_BEGIN
10
11 [SECTION .gdt]
12 ; GDT
13 ; 段基址, 段界限 , 属性
14 LABEL_GDT: Descriptor 0 , 0 , 0 ; 空描述符
15 LABEL_DESC_NORMAL: Descriptor 0 , 0ffffh, DA_DRW ; *** 注意此处为Normal 描述符 *****
16 LABEL_DESC_CODE32: Descriptor 0 , SegCode32Len - 1 , DA_C + DA_32 ; 非一致代码段, 32
17 LABEL_DESC_CODE16: Descriptor 0 , 0ffffh, DA_C ; 非一致代码段, 16
18 LABEL_DESC_DATA: Descriptor 0 , DataLen - 1 , DA_DRW ; Data
19 LABEL_DESC_STACK: Descriptor 0 , TopOfStack, DA_DRWA + DA_32 ; Stack, 32 位
20 LABEL_DESC_TEST: Descriptor 0500000h, 0ffffh, DA_DRW
21 LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRW ; 显存首地址
22 ; GDT 结束
23
24 GdtLen equ $ - LABEL_GDT ; GDT长度
25 GdtPtr dw GdtLen - 1 ; GDT界限
26 dd 0 ; GDT基地址
27
28 ; GDT 选择子
29 SelectorNormal equ LABEL_DESC_NORMAL - LABEL_GDT
30 SelectorCode32 equ LABEL_DESC_CODE32 - LABEL_GDT
31 SelectorCode16 equ LABEL_DESC_CODE16 - LABEL_GDT
32 SelectorData equ LABEL_DESC_DATA - LABEL_GDT
33 SelectorStack equ LABEL_DESC_STACK - LABEL_GDT
34 SelectorTest equ LABEL_DESC_TEST - LABEL_GDT
35 SelectorVideo equ LABEL_DESC_VIDEO - LABEL_GDT
36 ; END of [SECTION .gdt]
37
38 [SECTION .data1] ; 数据段
39 ALIGN 32
40 [BITS 32 ]
41 LABEL_DATA:
42 SPValueInRealMode dw 0
43 ; 字符串
44 PMMessage: db " In Protect Mode now. ^-^ " , 0 ; 进入保护模式后显示此字符串
45 OffsetPMMessage equ PMMessage - $$ ; 字符串PMMessage相对于LABEL_DATA的偏移,相对于数据段的偏移
46 StrTest: db " ABCDEFGHIJKLMNOPQRSTUVWXYZ " , 0
47 OffsetStrTest equ StrTest - $$
48 DataLen equ $ - LABEL_DATA
49 ; END of [SECTION .data1]
50