一段汇编,引自《自己动手写操作系统》

最近在看这本书,看得很郁闷,全是汇编,下面贴一段代码:主要是讲如何从实模式进入保护模式

 

基本上没动,抄的书上的,编译也过了,就是没输出结果,头痛!!!待解决。。

;=============================================
; pmtest1.asm
; 编译方法: nasm pmtest1.asm -o pmtest1.com
; robbie 2010-06-30
;=============================================

 

%include "pm.inc"  ;常量、宏以及说明

org 0100h          ;告诉编译器程序加载到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结束

;上面定义了一些描述符,初始了其结构,描述符的结构定义在pm.inc中

 

GdtLen equ $ - LABEL_GDT  ;GDT长度
GdtPtr dw GdtLen - 1      ;GDT界限
       dd 0               ;GDT基址

;这里定义了所有GDT即描述符的长度,以及GDT基址及界限

 

;GDT选择子 由它来定位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  ->上面几句我的理解是把段*16+偏移地址得到的地址转成描述符的结构

    ;为加载gdtr做准备
    xor eax, eax
    mov ax, ds
    shl eax, 4
    add eax, LABEL_GDT
    mov dword [GdtPtr + 2], eax

    ;加载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


[SECTION .s32]  ;32位代码段,由实模式进入
[BITS 32]

LABEL_SEG_CODE32:
    mov ax, SelectorVideo
    mov gs, ax

    mov edi, (80 * 10 + 0) * 2
    mov ah, 0Ch
    mov al, 'P'
    mov [gs:edi], ax

    ;到此停止

    jmp $

SegCode32Len    equ $ - LABEL_SEG_CODE32
;END of [SECTION .s32]

要看懂这段代码,请看http://blog.csdn.net/wangshenwq/archive/2008/09/14/2927636.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

robbie1314

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值