Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5772091
  • 博文数量: 675
  • 博客积分: 20301
  • 博客等级: 上将
  • 技术积分: 7671
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-31 16:15
文章分类

全部博文(675)

文章存档

2012年(1)

2011年(20)

2010年(14)

2009年(63)

2008年(118)

2007年(141)

2006年(318)

分类:

2006-09-15 20:40:06

; ==========================================
; pmtest1.asm
; 编译方法:nasm pmtest1.asm -o pmtest1.com
; ==========================================
 
%include    "pm.inc"    ; 常量, 宏, 以及一些说明
 
org    0100h
    jmp    LABEL_BEGIN
 
[SECTION .gdt]
; GDT
;                                         段基址,      段界限     , 属性
LABEL_GDT:        Descriptor           0,                0, 0             ; 空描述符
LABEL_DESC_CODE32:    Descriptor           0, SegCode32Len - 1, DA_C + DA_32    ; 非一致代码段, 32
LABEL_DESC_VIDEO:    Descriptor     0B8000h,           0ffffh, DA_DRW        ; 显存首地址
; GDT 结束
 
GdtLen        equ    $ - LABEL_GDT    ; GDT长度
GdtPtr        dw    GdtLen - 1    ; GDT界限
        dd    0        ; GDT基地址
 
; GDT 选择子
SelectorCode32        equ    LABEL_DESC_CODE32    - LABEL_GDT
SelectorVideo        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 位代码段描述符
    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
 
    ; 为加载 GDTR 作准备
    xor    eax, eax
    mov    ax, ds
    shl    eax, 4
    add    eax, LABEL_GDT        ; eax <- gdt 基地址
    mov    dword [GdtPtr + 2], eax    ; [GdtPtr + 2] <- gdt 基地址
 
    ; 加载 GDTR
    lgdt    [GdtPtr]
 
    ; 关中断
    cli
 
    ; 打开地址线A20
    in    al, 92h
    or    al, 00000010b
    out    92h, al
 
    ; 准备切换到保护模式
    mov    eax, cr0
    or    eax, 1
    mov    cr0, eax
 
    ; 真正进入保护模式
    jmp    dword SelectorCode32:0    ; 执行这一句会把 SelectorCode32 装入 cs, 并跳转到 Code32Selector:0  处
; END of [SECTION .s16]
 
 
[SECTION .s32]; 32 位代码段. 由实模式跳入.
[BITS    32]
 
LABEL_SEG_CODE32:
    mov    ax, SelectorVideo
    mov    gs, ax            ; 视频段选择子(目的)
 
    mov    edi, (80 * 10 + 0) * 2    ; 屏幕第 10 行, 第 0 列。
    mov    ah, 0Ch            ; 0000: 黑底    1100: 红字
    mov    al, 'P'
    mov    [gs:edi], ax
 
    ; 到此停止
    jmp    $
 
SegCode32Len    equ    $ - LABEL_SEG_CODE32
; END of [SECTION .s32]
 

##################################################################
#
#1、准备GDT
#2、用lgdt加载gdtr
#3、打开A20
#4、置cr0的PE位
#5、跳转,进入保护模式
##################################################################
阅读(3353) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~