最近在看这本书,看得很郁闷,全是汇编,下面贴一段代码:主要是讲如何从实模式进入保护模式
基本上没动,抄的书上的,编译也过了,就是没输出结果,头痛!!!待解决。。
;=============================================
; 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