【学习笔记】自己动手写操作系统--pmtest1

 

ContractedBlock.gif ExpandedBlockStart.gif Code
; ==========================================
;
 pmtest1.asm
;
 编译方法:nasm pmtest1.asm -o pmtest1.com
;
 ==========================================

%INCLUDE    
"pm.inc"    ; 常量, 宏, 以及一些说明

ORG    0100h
    
JMP    LABEL_BEGIN

[SECTION .gdt]
; GDT
;
                                         段基址,      段界限     , 属性
LABEL_GDT:        Descriptor           0,                00             ; 空描述符
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界限 定义GdtPtr的数据结构
        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 ; 默认启动时候cs为0
    
MOV    DS, AX
    
MOV    ES, AX
    
MOV    SS, AX
    
MOV    SP, 0100h

    
; 初始化 32 位代码段描述符,把LABEL_SEG_CODE32中地址值(CS+偏移)的每个字节分别复制给LABEL_DESC_CODE32对应得2,4,7号字节位置
    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 作准备,得到GdtPtr 的地址,也就是Gdtprt数据结构的地址,对第二个“属性”赋值,为Gdt的数据结构的首地址
    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]

 

转载于:https://www.cnblogs.com/dfzx/archive/2009/05/27/1490654.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值