zoukankan      html  css  js  c++  java
  • Win32基础知识2 Win32汇编语言003

    Win32基础知识2

     

    让编程改变世界

    Change the world by program


     

    实模式

      处理器被复位或者加电的时候以实模式启动。 这时候处理器中各寄存器以实模式的初始化值工作。 80386处理器在实模式下的存储器寻址方式和8086是一样的,由段寄存器的内容乘以 16当做基地址,加上段内的偏移地址形成最终的物理地址,这时候它的32位地址线只使用了低20位。   在实模式下,80386处理器不能对内存进行分页管理,所以指令寻址的地址就是内存中实际的物理地址。在实模式下,所有的段都是可以读、写和执行的。 实模式下80386不支持优先级,所有的指令相当于工作在特权级(优先级0),所以它可以执行所有特权指令,包括读写控制寄存器CR0等。 实际上,80386就是通过在实模式下初始化控制寄存器,GDTR,LDTR,IDTR与TR等管理寄存器以及页表,然后再通过加载CR0使其中的保护模式使能位置位而进入保护模式的。   当然,实模式下不支持硬件上的多任务切换。 实模式下的中断处理方式和8086处理器相同,也用中断向量表来定位中断服务程序地址。 中断向量表的结构也和8086处理器一样:每4个字节组成一个中断向量,其中包括两个字节的段地址和两个字节的偏移地址。   从编程的角度看,除了可以访问80386新增的一些寄存器外,实模式的80386处理器和8086有什么进步呢? 其实最大的好处是可以使用80386的32 位寄存器,用32位的寄存器进行编程可以使计算程序更加简捷,加快了执行速度。   比如在8086时代用16位寄存器来完成32位的乘法和除法时,要进行的步骤实在是太多了,现在用32位寄存器一条指令就可以完成。 80386中增加的两个辅助段寄存器FS和GS在实模式下也可以使用,这样,同时可以访问的段达到了6个而不必考虑重新装入的问题。 最后,很多80386的新增指令也使一些原来不很方便的操作得以简化。  

    保护模式

      当 80386工作在保护模式下的时候,它的所有功能都是可用的。这时80386所有的32根地址线都可供寻址,物理寻址空间高达4GB。 在保护模式下,支持内存分页机制,提供了对虚拟内存的良好支持。   虽然与8086可寻址的1 MB物理地址空间相比,80386可寻址的物理地址空间可谓很大,但实际的微机系统不可能安装如此大的物理内存。 所以,为了运行大型程序和真正实现多任务,虚拟内存是一种必需的技术。   保护模式下80386支持多任务,可以依靠硬件仅在一条指令中实现任务切换。任务环境的保护工作是由处理器自动完成的。 在保护模式下,80386处理器还支持优先级机制,不同的程序可以运行在不同的优先级上。 优先级一共分0~3 共 4个级别,操作系统运行在最高的优先级0上,应用程序则运行在比较低的级别上。   配合良好的检查机制后,既可以在任务间实现数据的安全共享也可以很好地隔离各个任务。 从实模式切换到保护模式是通过修改控制寄存器CR0的控制位PE(位0)来实现的。   在这之前还需要建立保护模式必需的一些数据表,如全局描述符表GDT和中断描述符表IDT等。 DOS操作系统运行于实模式下,而Windows操作系统运行于保护模式下。    

    虚拟8086模式

      虽说实模式兼容以前的系统,但是设想一下,如果Windows或80386处理器推出的时候宣布不能运行以前的MS-DOS程序,那么就等于放弃了一个巨大的软件库,Windows以及80386处理器可能就会落得和苹果机一样的下场,这是Microsoft 和Intel都不愿看到的。 举个简单的例子,当你正兴高采烈地计划利用80386多任务并行的特性,边欣赏《小甲鱼大战仓小姐》的大片边完成小甲鱼的编程作业时,发觉原来的文档要用到原来的系统才能打开……   由于这种特殊需求的普遍性,虚拟8086应运而生! 虚拟86模式是以任务形式在保护模式上执行的,在 80386上可以同时支持由多个真正的80386任务和虚拟86模式构成的任务。 在虚拟86模式下,80386支持任务切换和内存分页。在Windows 操作系统中,有一部分程序专门用来管理虚拟86模式的任务,称为虚拟86管理程序。   既然虚拟86模式以保护模式为基础,它的工作方式实际上是实模式和保护模式的混合。 为了和8086程序的寻址方式兼容,虚拟86模式采用和8086一样的寻址方式,即用段寄存器乘以16当做基址再配合偏移地址形成线性地址,寻址空间为1 MB。   但显然多个虚拟86任务不能同时使用同一位置的1 MB地址空间,否则会引起冲突。 操作系统利用分页机制将不同虚拟86任务的地址空间映射到不同的物理地址上去,这样每个虚拟86任务看起来都认为自己在使用0~1 MB的地址空间。   8086代码中有相当一部分指令在保护模式下属于特权指令,如屏蔽中断的cli和中断返回指令iret 等。 这些指令在8086程序中是合法的。如果不让这些指令执行,8086代码就无法工作。为了解决这个问题,虚拟86管理程序采用模拟的方法来完成这些指令。 虚拟86管理程序在异常处理程序中检查产生异常的指令,如果是中断指令,则从虚拟86任务的中断向量表中取出中断处理程序的入口地址,并将控制转移过去。   如果是危及操作系统的指令,如cli等,则简单地忽略这些指令,在异常处理程序返回的时候直接返回到下一条指令。 通过这些措施,8086程序既可以正常地运行下去,在执行这些指令的时候又觉察不到已经被虚拟86管理程序做了手脚。MS-DOS应用程序在Windows 操作系统中就是这样工作的。 [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://urlxf.qq.com/?6BJvAfi']视频下载[/Downlink]
  • 相关阅读:
    POJ 1015 Jury Compromise【DP】
    POJ 1661 Help Jimmy【DP】
    HDU 1074 Doing Homework【状态压缩DP】
    HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
    占坑补题。。最近占的坑有点多。。。
    Codeforces 659F Polycarp and Hay【BFS】
    Codeforces 659E New Reform【DFS】
    Codeforces 659D Bicycle Race【计算几何】
    廖大python实战项目第四天
    廖大python实战项目第三天
  • 原文地址:https://www.cnblogs.com/LoveFishC/p/3847093.html
Copyright © 2011-2022 走看看