80x86的3种工作方式

时间:2023-02-02 12:14:48

80x86中的32位CPU全面支持32位的数据、指令和寻址方式,提供了3种工作方式:是地址方式、保护方式和保护方式下的虚拟8086方式。在计算机上电或复位后,32位CPU首先初始化为是地址方式,再通过是地址方式进入32位保护工作方式。保护方式是32位CPU固有的工作方式,只有在该方式下CPU才能发挥其全部功能。在保护方式下,可通过设置控制标志使CPU转入虚拟8086工作方式。

实地址方式

实地址方式是为了与16位的8086兼容而保留的工作方式。在此方式下,可以使用32位寄存器和32位操作数,也可以采用32位的寻址方式。32位CPU与16位CPU一样,只能寻址1MB物理存储空间,程序段的大小不超过64KB,段基址和偏移地址都是16位的,这样的段也称为“16位段”。

保护方式

在保护方式下,使用32位地址线,寻址4GB的物理存储空间,虚拟存储空间可达64TB。段基址和段内偏移量都是32位的,程序段的大小可达4GB,这样的段也称为“”32位段。该方式提供了支持多任务的硬件机构,能位每个任务提供一台虚拟处理器来仿真多台处理器,此时,操作系统将CPU轮流分配给每一个虚拟处理器运行该空间中的任务,并在各种任务之间来回快速而方便地切换。分段和分页的存储管理功能能对各个任务分配不同的虚拟存储空间,实施执行环境的隔离和保护,对不同的段设立特权级并进行访问权限检查,以防不同的用户程序之间、用户程序与系统程序之间的非法访问和干扰破坏,使操作系统和个应用程序都收到保护。这也是将该工作方式称为保护方式的原因。

虚拟8086方式(V86方式)

此方式是一种在保护方式下运行的类似实方式的工作环境,因此,能充分利用保护方式提供的多任务硬件机构、强大的存储管理和保护能力。例如,多个8086程序可以通过分页存储管理机制,将各自的1MB地址空间映射到4GB物理地址的不同位置,从而共存于主存且并行运行,没个程序就像在自己的8086中单独运行一样。CPU不但可以执行多个虚拟8086任务,还可以将虚拟8086任务与其他32位CPU任务一起执行。

综上:对于80x86中32位CPU,在实方式下执行的是16位段的程序(寄存器和数据可以是32/16位);在保护方式下可以对32位段和16位段的程序单独或混合操作;虚拟8086方式可并行执行多个8086的16位段程序,但由于它与实方式的特权级不同,因此,它还不能代替实方式

一个计算机系统的存储系统由主存和辅助存储器组成。通常所称的软盘、硬盘、U盘、光盘、磁带是外存储器,属于计算机的外部设备,用来存放当前不参加运行的程序和数据,在需要时可与主存成批地交换信息。其特点是存储容量大但存取速度低,价格便宜。主存设在主机内部,用来存放当前运行的程序和所需的数据,以便随时向CPU高速地提供信息。相对外存储器而言,主存容量较小,成本高,但存取速度快。主存的基本存储单位是位,它能容纳一个二进制数的0或1.

为了区别这些不同的(或字或双字)存储单元,每一单元都被指定一个编号,称为此单元的物理地址(简称PA)。80X86机的主存是按8位字节编址的,即以字节作为最小寻址单位。假设主存容量为2MB,则它的最低地址为0,最高地址为01FFFFFH

堆栈是在主存中开辟的一片数据存储区,从硬件观点看,堆栈必须由一片存储单元和一个指示器组成。固定端叫栈底。栈指针用来指示栈元素进栈和出栈时偏移地址的变化,指针所指示的最后存入数据的单元叫栈顶,所有信息的存取都在栈顶进行,因而栈指针总是指向栈顶的。

80X86允许用户建立自己的字或双字堆栈,其存储区位置由堆栈段寄存器SS给定,并固定采用SP或ESP做指针,即SP或ESP的内容为栈顶相对于SS的偏移地址。空栈时,SP/ESP指向堆栈段的最高地址即栈底,存入时栈顶均由高地址向低地址变化。

物理地址的形成

在80X86系列机中,最低档CPU是8086,它只有20根地址线,直接寻址能力为2的20次方B,主存容量可达1MB,物理地址编号从0~0FFFFFH。这样一来,CPU与存储器交换信息必须使用20位的物理地址。但是,8086内部却是16位结构,它里面与地址有关的寄存器全部都是16位的,例如,SP、BP、SI、DI、IP等。因此,它只能进行16位地址运算,表示16位地址,寻找操作数的范围最多也只能是64KB。位了能表示20位物理地址,8086的设计人员提出了将主存分段使用的方案:将1MB的存储器按64KB分段,设置4个段寄存器CS、DS、SS、ES,保存当前可使用段的段首址。如果使各段的段首址都从能被16除的地址开始,那么,这些段首址的最低4位总是0,;若暂时忽略这些0,则段首址的高16位正好装入一个段寄存器中。访问存储单元时,CPU可以根据操作的性质和要求,选择某一适当的段寄存器,将它里面的内容左移4位,即在最低位后面补入了4个0,恢复了段首址原来的值,再与本段中某一待访问存储单元的偏移地址相加,则得到该单元的20位物理地址。这样一来,寻找操作数的范围就可达到1MB。由此可看出,段中某一存储单元的地址是用两部分来表示的,即“段首地址:偏移地址”,称为二维的逻辑地址。主存的分段使用技术可以让系统很方便地将程序中的代码段、数据段、堆栈段经重定位后,分开放在不同的存储区域里。

随着80X86系列机的发展,特别是32位CPU的推出,它已能全面支持32位的数据、指令和寻址方式,可访问4GB的存储空间。但为了与低档的8086兼容,一直保留了主存的分段使用技术,段寄存器也由4个增加至6个并提供了实方式。

实方式物理地址的形成

在实方式下,32位CPU与8086一样,只能寻址1MB物理存储空间并采用分段使用的方式,每段的大小不超过64KB,段首地址和段内偏移地址都用16位表示。这样,1MB的存储空间最少可分16个段,这6个段为:代码段、堆栈段、数据段和3个附加数据段。这些当前能被CPU访问段的首地址由分段部件中的6个专用段寄存器来给出。

CS:给出当前代码段首地址(取指令指针为IP)

SS:给出当前堆栈段首地址(堆栈指针为SP)。

DS;给出当前数据段首地址。

ES、FS、GS:给出当前附加数据段首地址。

其中,代码段是程序代码的存储区,指令指示器IP总是保存着下一条将要取出指令相对于CS的偏移地址。在代码段中取指令时,指令物理地址:PA=(CS)左移4位+(IP)

堆栈段是程序的临时数据存储区,存放暂时不用的数据。在用户程序中,一般都需要用户自己建立堆栈段,特别是在作子程序调用、系统功能调用等操作时,堆栈段更是必不可少的。用户一旦定义好堆栈段,系统就将自动以SP为指针。做堆栈操作时,栈顶物理地址PA=(SS)左移4位+(SP)

数据段和附加数据段是程序中使用的数据存储区。在一般情况下,程序中不需要定义附加数据段,如果必须定义附加数据段,则在数据量不是太大时,最简单方法是让附加数据段和数据段重合,即将他们设置成一个段。当需要在数据段中读/写数据时,数据的物理地址PA=(DS

或ES、FS、GS)+16位偏移地址

其中,数据的偏移地址由寻址方式确定。

在汇编源程序中,用户必须将数据段首址置入DS或ES、FS和GS中,而CS,SS由系统自动置入