您的位置:首页 > 其它

自己编写操作系统的笔记3

2009-03-24 20:13 357 查看
今天研究了很长的时间,效果是显著的,可是结果……还是没有成功。

今天主要研究怎么进入保护模式。于渊 的nasm写的总是好像很简单,可是lgdt [GdtPtr],jmp dword SelectorCode32:0,mov [gs:edi], ax怎么也改不出可以编译通过的代码。

这是代码:

Title	ProtectModeTest.asm
.386

include	function.inc

code segment use32
start:
org	0100h
jmp	LABEL_BEGIN

; 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		; GDT界限
dd	0		; GDT基地址

; GDT 选择子
SelectorCode32		equ	LABEL_DESC_CODE32	- LABEL_GDT
SelectorVideo		equ	LABEL_DESC_VIDEO	- LABEL_GDT

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 ptr [LABEL_DESC_CODE32 + 2],ax
shr	eax, 16
mov	byte ptr [LABEL_DESC_CODE32 + 4], al
mov	byte ptr [LABEL_DESC_CODE32 + 7],ah

; 为加载 GDTR 作准备
xor	eax, eax
mov	ax, ds
shl	eax, 4
add	eax, LABEL_GDT		; eax <- gdt 基地址
mov	dword ptr [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	SelectorCode32:0	; 执行这一句会把 SelectorCode32 装入 cs, 并跳转到 Code32Selector:0  处

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	word ptr [gs:edi],ax

; 到此停止
jmp	$

SegCode32Len	equ	$ - LABEL_SEG_CODE32

code	ends
end	start


然后在网上找了一天的资料,发现一本80x86汇编语言程序设计教程的书,比我原先看的IBM汇编语言好了不知多少倍,把段、保护模式讲的几乎没什么秘密了。可惜目前没有书,电子版又很不好看,研究的很慢。

besides,发现了上个日志中的那个网站,帮助不能说没有,可是他改的有些晦涩,主要有些偏移地址无法了解。看来今天参不透了。

目前的问题是lgdt [GdtPtr],jmp dword SelectorCode32:0,mov [gs:edi], ax用masm怎么写,为什么。

我的错误信息是

Assembling: protectmodetest.asm
protectmodetest.asm(50) : error A2085:
protectmodetest.asm(66) : error A2096:
protectmodetest.asm(75) : error A2032:

希望知道的朋友帮忙告一下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: