保护模式( 一)

 1 ; ==========================================
 2 ; pmtest1.asm
 3 ; 编译方法:nasm pmtest1.asm -o pmtest1.bin
 4 ; ==========================================
 5 
 6 %include    "pm.inc"    ; 常量, 宏, 以及一些说明
 7 
 8 org    07c00h
 9     jmp    LABEL_BEGIN
10 
11 [SECTION .gdt]
12 ; GDT
13 ;                              段基址,       段界限     , 属性
14 LABEL_GDT:       Descriptor       0,                0, 0           ; 空描述符
15 LABEL_DESC_CODE32: Descriptor       0, SegCode32Len - 1, DA_C + DA_32; 非一致代码段
16 LABEL_DESC_VIDEO:  Descriptor 0B8000h,           0ffffh, DA_DRW         ; 显存首地址
17 ; GDT 结束
18 
19 GdtLen        equ    $ - LABEL_GDT    ; GDT长度
20 GdtPtr        dw    GdtLen - 1    ; GDT界限
21         dd    0        ; GDT基地址
22 
23 ; GDT 选择子
24 SelectorCode32        equ    LABEL_DESC_CODE32    - LABEL_GDT
25 SelectorVideo        equ    LABEL_DESC_VIDEO    - LABEL_GDT
26 ; END of [SECTION .gdt]
27 
28 [SECTION .s16]
29 [BITS    16]
30 LABEL_BEGIN:
31     mov    ax, cs
32     mov    ds, ax
33     mov    es, ax
34     mov    ss, ax
35     mov    sp, 0100h
36 
37     ; 初始化 32 位代码段描述符
38     xor    eax, eax
39     mov    ax, cs
40     shl    eax, 4
41     add    eax, LABEL_SEG_CODE32
42     mov    word [LABEL_DESC_CODE32 + 2], ax
43     shr    eax, 16
44     mov    byte [LABEL_DESC_CODE32 + 4], al
45     mov    byte [LABEL_DESC_CODE32 + 7], ah
46 
47     ; 为加载 GDTR 作准备
48     xor    eax, eax
49     mov    ax, ds
50     shl    eax, 4
51     add    eax, LABEL_GDT        ; eax <- gdt 基地址
52     mov    dword [GdtPtr + 2], eax    ; [GdtPtr + 2] <- gdt 基地址
53 
54     ; 加载 GDTR
55     lgdt    [GdtPtr]
56 
57     ; 关中断
58     cli
59 
60     ; 打开地址线A20
61     in    al, 92h
62     or    al, 00000010b
63     out    92h, al
64 
65     ; 准备切换到保护模式
66     mov    eax, cr0
67     or    eax, 1
68     mov    cr0, eax
69 
70     ; 真正进入保护模式
71     jmp    dword SelectorCode32:0    ; 执行这一句会把 SelectorCode32 装入 cs,
72     ;等价于 jmp dword 0x8:0        ; 并跳转到 Code32Selector:0  处
73 ; END of [SECTION .s16]
74 
75 
76 [SECTION .s32]; 32 位代码段. 由实模式跳入.
77 [BITS    32]
78 
79 LABEL_SEG_CODE32:
80     mov    ax, SelectorVideo    ;等价于 mov ax, 0x10
81     mov    gs, ax            ; 视频段选择子(目的)
82 
83     mov    edi, (80 * 11 + 79) * 2    ; 屏幕第 11 行, 第 79 列。
84     mov    ah, 0Ch            ; 0000: 黑底    1100: 红字
85     mov    al, 'P'
86     mov    [gs:edi], ax
87 
88     ; 到此停止
89     jmp    $
90 
91 SegCode32Len    equ    $ - LABEL_SEG_CODE32
92 ; END of [SECTION .s32]
93  
View Code

 

posted on 2015-01-23 19:43  crkey  阅读(166)  评论(0)    收藏  举报

导航