实模式与保护模式切换实例
日期:2007年11月6日 作者: 查看:[大字体 中字体 小字体]-
从本实例源程序可见,全局描述符表GDT仅有四个描述符:第一个是空描述符;第二个是代码段描述符;第三个和第四个分别为源数据段及目标数据段描述符。本实例各描述符中的段界限是在定义时设置的,并且除伪描述符VGDTR中的界限按GDT的实际长度设置外,各使用的存储段描述符的界限都规定为0FFFFH。另外,描述符中的段属性也根据所描述段的类型被预置,各属性的定义在包含文件386SCD.INC中均有说明。从属性值可知,这三个段都是16位段。
由于在切换到保护方式后就要引用GDT,所以在切换到保护方式前必须装载GDTR。实例中使用如下指令装载GDTR:
LGDT QWORD PTR VGDTR
该指令的功能是把存储器中的伪描述符VGDTR装入到全局描述符表寄存器GDTR中。伪描述符VGDTR的结构如前所述结构类型PDESC所示,低字是以字节位单位的全局描述符表段的界限,高双字为描述符表段的线性基地址(本实例不启用分页机制,所以线性地址等同于物理地址)。本实例中未涉及到局部描述符表及中断描述符表,后面的文章将作详细说明。
(2)由实模式切换到保护模式
在做好准备后,从实模式切换到保护模式并不难。原则上只要把控制寄存器CR0中的PE位置1即可。本实例采用如下三条指令设置PE位:
mov eax,cr0
or eax,1
mov cr0,eax
实际情况要比这复杂些。执行上面的三条指令后,处理器转入保护模式,但CS中的内容还是实模式下代码段的段值,而不是保护模式下代码段的选择子,所以在取指令之前得把代码段的选择子装入CS。为此,紧接着这三条指令,安排一条如下所示的段间转移指令:
JUMP16 Code_Sel ,< OFFSET Virtual >
这条段间转移指令 在实模式下被预取并在保护方式下被执行 。利用这条段间转移指令可把保护模式下代码段的选择子装入CS,同时也刷新指令预取队列。从此真正进入保护模式。
(3)由保护模式切换到实模式
在80386上,从保护模式切换到实模式的过程类似于从实模式切换到保护模式。原则上只要把控制寄存器CR0中的PE位清0即可。实际上,在此之后也要安排一条段间转移指令,一方面清指令预取队列,另一方面把实模式下代码段的段值送CS。 这条段间转移指令在保护方式下被预取并在实模式下被执行 。
(4)保护模式下的数据传送
首先,把源数据段和目标数据段的选择子装入DS和ES寄存器,这两个描述符已在实模式下设置好,把选择子装入段寄存器就意味着把包括基地址在内的段信息装入到了段描述符高速缓冲寄存器。然后设置指针寄存器SI和DI的初值,也设置计数器CX的初值。根据预置的段属性,在保护方式下,代码段也仅是16位段,串操作指令只使用16位的SI、DI和CX等寄存器。最后利用串操作指令实施传送。
(5)显示缓冲区中的内容
由于缓冲区在常规内存中,所以在实模式下根据要求按十六进制显示其内容是很容易理解的,这里就不再多说。
4.内存映象
在源程序中没有把GDT作为一个单独的段对待,但在进入保护方式后,它是一个独立的段。从对代码段和源数据段描述符所赋的基地址和段界限值可见,代码段和数据段有部分覆盖。尽管这样做不利于代码和数据的安全,但如果需要,这样做是可行的。本实例运行时的内存映象如下图所示。 - 上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] 下一页
-
- 实模式与保护模式切换实例 相关文章:
- ·格言警句:诚实做人格言
- ·女人们听好了:其实色狼都是好男人
- ·Excel XP函数实用教程精华集
- ·电脑高手必备 Windows系统35招实用技巧
- ·学生成绩管理系统实习
- ·如何实现局域网打印机共享
- ·一个Struts实现分页,增删改查,Tiles,国际化的DEMO
- ·精彩推荐:全Flash网站制作实例
- ·FLASH 8实例教程:瀑布动画制作方法
- ·摄影师镜头下的百姓真实生活
- 实模式与保护模式切换实例 相关软件
- ·实况世界杯2002 中文版
- ·《实况足球胜利11人》GBA中文版
- ·Turbo C/C++ for Windows 集成实验与学习环境 V2007.9.0
- ·疯狂机器3之新实验
- ·Photoshop视频实例教程系列电子书 V1.0
- ·《实况足球8》国际版免CD补丁
- ·实况足球10欧洲版
- ·韩国语实用语法
- ·实况足球9 游戏汉化补丁
- ·AutoCAD 实战妙技百问 VB051118
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
上一篇:纯DOS下无需加载MSCDEX,直接弹出或关闭CD-ROM舱
下一篇:汇编指令与机器码的相互转换
精品推荐
热点TOP10
- ·图象处理中的边缘检测------canny算子
- ·DENX U-Boot及Linux使用手册
- ·UDT协议-基于UDP的可靠数据传输协议
- ·EZ-USB 68013A开发指南
- ·利用 wordXP 实现自动排班
- ·DDK 学习经验
- ·利用Haffman 算法实现对ascii字符文件的压缩
- ·实模式与保护模式切换实例
- ·在Solaris 10 X86上安装Oracle 10g RAC详解 (1)
- ·[仿真实验]操作系统的内存管理
- ·飞机躲避小游戏---是男人就撑100秒的制作
- ·扩展Int 13H调用规范
- ·小议char *和C语言的字符串
- ·跟我一起写 Makefile
- ·[收藏]Web2.01,a rich internet application example
- ·视频与图像RGB/YUV格式详解
- ·Visual C++ ADO数据库编程入门
- ·交换机MAC地址表的形成过程动态演示
- ·基于VC的WinSock网络编程实用宝典
- ·三维粒子系统在AS2中的实现
特别推荐
- ·Symbian系统入门
- ·基于VC的WinSock网络编程实用宝典
- ·扩展Int 13H调用规范
- ·列出System.getProperty的所有返回值
- ·Linux2.4.18内核下基于LKM的系统调用劫持
- ·控件“树”中多选拖放功能的实现
- ·[分形]DLA团簇模型的摸拟
- ·samba和openldap结合实战
- ·教程:XSLT Designer快速入门指南
- ·设计面向Pocket PC浏览器的Web站点
- ·利用Haffman 算法实现对ascii字符文件的压缩
- ·跟我一起写 Makefile
- ·三维粒子系统在AS2中的实现
- ·汇编源码--DOSSYM
- ·消息报文处理组件(C/C++版)
- ·UDT协议-基于UDP的可靠数据传输协议
- ·利用 wordXP 实现自动排班
