您的位置:首页 > 其它

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

2009-04-17 18:09 148 查看
时隔如此多天,终于有了新进展。前两天不是一直不能正确输出吗?今天终于弄明白了,原来在gdt计算地址的时候ds没有指向gdt的段。就这么简单,居然耗费了如此长的时间,不得不说我对于dos下的debug还是不了解这回还是请出了turbo debugger,通过下边实时更新的数据才发现了这个简单的错误。可是现有的debugger都在lgdt的时候瞬间down掉,之后的调试该怎么办?又不是在dos虚拟机上运行,boch没有一点用,其它的又不能用……据说用一个微软的ice可以,今晚回去试一试。

此外有些错误就不能称之为错误。保护模式的程序在dos710是不能运行的,而手边没有dos622,最后用dosbox才能看到结果。关于veido的描述符也试验了很久,80x86上边基地址是0,偏移是b8000h。自己动手写操作系统的应该是VIDEOBUFF DESCRIPTOR <0FFFFH,08000H,0BH,0F00H+ATDW,0>,这个应该是正确的,事实证明也是正确的。

另外还看到一个人用的是VIDEOBUFF DESCRIPTOR <0FFFFH,0b800H,0,0F00H+ATDW,0>,居然也输出了让人丈二和尚摸不着头脑了。

老惯例,代码放上:

Title	Example.asm
;功能:演示任务内无特权级变换的转移
INCLUDE	386scd.lib
.386P

GDTSEG			SEGMENT				PARA	USE32	'GDT'		;全局描述符表数据段(32位)
GDT					LABEL					BYTE									;全局描述符表
DUMMY			DESCRIPTOR			<0,0,0,0,0>									;空描述符
NORMAL			DESCRIPTOR			<0FFFFH,0,0,ATDW,0>		;规范段描述符
NORMAL_SEL	=NORMAL-GDT
CODEP				DESCRIPTOR			<0FFFFH,0,0,ATCE,0>				;代码段k的描述符
CODEP_SEL		=CODEP-GDT
VIDEOBUFF		DESCRIPTOR			<0FFFFH,08000H,0BH,0F00H+ATDW,0>
VIDEO_SEL		=VIDEOBUFF-GDT
GDTLEN			=$-GDT														;全局描述符表长度
VGDTR				PDESC	<GDTLEN-1,>
GDTSEG			ENDS

RCODESEG		SEGMENT	PARA	USE16
ASSUME	CS:RCODESEG
START:
ASSUME	DS:GDTSEG
MOV	AX,GDTSEG
MOV	DS,AX
MOV	BX,16
MOV	AX,RCODESEG
MUL	BX
MOV	CODEP.BASEL,AX
MOV	CODEP.BASEM,DL
MOV	CODEP.BASEH,DH
MOV	AX,GDTSEG
MUL	BX
MOV	WORD	PTR	VGDTR.BASE,AX
MOV	WORD	PTR	VGDTR.BASE+2,DX
CLD
LGDT	FWORD	PTR	VGDTR
CLI
in	al,92h
or	al,00000010b
out	92h,al
MOV		EAX,CR0
OR		EAX,1
MOV		CR0,EAX
JUMP16	<CODEP_SEL>,<OFFSET	PROTECT>
PROTECT:
MOV	AX,VIDEO_SEL
MOV	GS,AX
MOV	EDI,(80*10+0)*2
MOV	AH,0CH
MOV	AL,'P'
MOV	GS:[EDI],AX
JMP	$
RCODESEG		ENDS
END	START


今晚还要继续奋斗!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: