购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.2.2 寄存器

处理器内部需要高速存储单元,用于暂时存放程序执行过程中的代码和数据,这些存储单元称为寄存器(Register)。处理器内部有多种寄存器,每种寄存器又可能有多个,从应用的角度可以将这些寄存器分成两类:透明寄存器和可编程寄存器。

有些寄存器对应用人员来说不可见,不能直接控制,例如,保存指令代码的指令寄存器,所以它们被称为透明寄存器。这里的“透明”(Transparency)是计算机学科中常用的一个专业术语,表示实际存在但从某个角度看好像没有,“透明”思想可以使我们抛开不必要的细节,而专注于关键问题。

底层语言程序员需要掌握可编程(Programmable)寄存器,它们具有引用名称,供编程使用。可编程寄存器还可以进一步分成通用寄存器和专用寄存器两类。

● 通用寄存器:这类寄存器在处理器中数量较多、使用频度较高,具有多种用途。例如,它们可用来存放指令需要的操作数据,又可用来存放地址以便在主存或I/O接口中指定操作数据的位置。

● 专用寄存器:这类寄存器只用于特定目的。例如,程序计数器(Program Counter,PC)用于记录将要执行指令的主存地址,标志寄存器用于保存指令执行的辅助信息。

IA-32处理器通用指令(整数处理指令)的基本执行环境包括8个32位通用寄存器、6个16位段寄存器、1个32位标志寄存器和1个32位指令指针寄存器,如图1-2所示(图中数字31、16、15、8、7、0等依次用于表达二进制位D 31 、D 16 、D 15 、D 8 、D 7 、D 0 )。

1.通用寄存器

通用寄存器(General-Purpose Register)一般是指处理器最常使用的整数通用寄存器,可用于保存整数数据、地址等。IA-32处理器只有8个32位通用寄存器。

IA-32处理器的8个32位通用寄存器分别被命名为EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP,它们是在原8086支持的16位通用寄存器的基础上扩展而得到的。上述8个名称中去掉表达扩展含义的字母E(Extended),就是8个16位通用寄存器的名称,即AX、BX、CX、DX、SI、DI、BP和SP,分别表示相应32位通用寄存器低16位部分。其中前4个通用寄存器AX、BX、CX和DX还可以进一步分成高字节H(High)和低字节L(Low)两部分,这样又有了8个8位通用寄存器:AH和AL、BH和BL、CH和CL、DH和DL。

图1-2 IA-32常用寄存器

编程中可以使用32位寄存器(如ESI),也可以只使用其低16位部分(名称中去掉字母E,如SI,多用在16位平台和操作16位数据时)。对前4个32位通用寄存器(如EAX),可以使用全部32位,即D 31 ~D 0 (EAX),可以使用低16位,即D 15 ~D 0 (AX),还可以将低16位再分成两个8位使用,即D 15 ~D 8 (AH)和D 7 ~D 0 (AL)。注意,存取16位寄存器时,相应的32位寄存器的高16位不受影响;存取8位寄存器时,相应的16位和32位寄存器的其他位也不受影响。这样,Intel 80x86处理器一方面保持了相互兼容,另一方面也可以方便地支持8位、16位和32位操作。

通用寄存器有多种用途,可以保存数据、暂存运算结果,也可以存放存储器地址、作为变量的指针。但在IA-32处理器中每个寄存器又有它们各自的特定作用,并因而得名。程序中通常也按照含义使用它们,如表1-1所示。

表1-1 IA-32处理器的通用寄存器

许多指令有两个操作数:源操作数和目的操作数。

● 源操作数是指被传送或参与运算的操作数。

● 目的操作数是指保存传送结果或运算结果的操作数。

堆栈(Stack)是一个特殊的存储区域,它采用先进后出(First In Last Out,FILO)或称为后进先出(Last In First Out,LIFO)的操作方式存取数据。调用子程序时,它用于暂存数据、传递参数、存放局部变量,也可以用于临时保存数据。堆栈指针会随着处理器执行有关指令自动增大或减小,所以ESP不应该再用于其他目的,因此ESP可归类为专用寄存器,但是,ESP又可以像其他通用寄存器一样灵活地改变。

2.标志寄存器

标志(Flag)用于反映指令执行结果或控制指令执行形式。许多指令执行之后将影响有关的状态标志位,不少指令的执行要利用某些标志,当然,也有很多指令与标志无关。处理器中用一个或多个二进制位表示一种标志,0或1的不同组合表示标志的不同状态。Intel 8086支持的标志形成了一个16位的标志寄存器FLAGS。以后各代80x86处理器有所增加,形成了32位的EFLAGS标志寄存器,如图1-3所示(图上方的数字表示该标志在标志寄存器中的位置)。EFLAGS标志寄存器包含一组状态标志、一个控制标志和一组系统标志,其初始状态为00000002H(也就是D 1 位为1,其他位全部为0。H表示这是用十六进制表达的数据),其中1、3、5、15和22~31位被保留,软件不应该使用它们或依赖于这些位的状态。

图1-3 标志寄存器EFLAGS

(1)状态标志

状态标志是最基本的标志,用来记录指令执行结果的辅助信息。加减运算指令和逻辑运算指令是主要设置状态标志的指令,其他有些指令的执行也会相应地设置它们。状态标志有6个,处理器主要使用其中5个构成各种条件,分支指令判断这些条件以实现程序分支。状态标志从低位到高位依次是:进位标志CF(Carry Flag)、奇偶标志PF(Parity Flag)、调整标志AF(Adjust Flag)、零标志ZF(Zero Flag)、符号标志SF(Sign Flag)、溢出标志OF(Overflow Flag)。

(2)控制标志

IA-32处理器只有一个控制标志:方向标志DF(Direction Flag)。该标志仅用于串操作指令,控制地址的变化方向。

(3)系统标志

系统标志用于控制操作系统或核心管理程序的操作方式,应用程序不应该修改它们。例如,中断允许标志IF(Interrupt-enable Flag)或简称中断标志,用于控制外部可屏蔽中断是否可以被处理器响应。再如,陷阱标志TF(Trap Flag)也常称为单步标志,用于控制处理器是否进入单步操作方式。

8086具有9个基本标志,后续处理器增加的标志主要用于处理器控制,由操作系统使用,在学习指令时将会涉及它们的具体用法。其中状态标志比较关键,它是汇编语言程序设计中必须特别注意的一个方面。

3.指令指针寄存器

程序由指令组成,指令存放在主存储器中。处理器需要一个专用寄存器表示将要执行的指令在主存中的位置,这个位置用存储器地址表示。在IA-32处理器中,存储器地址保存在32位指令指针寄存器EIP中。16位80x86处理器使用低16位部分IP。

EIP具有自动增量的能力。一旦处理器执行完一条指令,EIP就加上该指令的字节数,指向下一条指令,实现程序的顺序执行。需要实现分支、调用等操作时要修改EIP,其改变将使程序转移到指定的指令执行。但EIP寄存器不能像通用寄存器那样直接赋值修改,而是在执行控制转移指令(如跳转、分支、调用和返回指令)、出现中断或异常时被处理器赋值而相应改变。

4.段寄存器

程序中有可以执行的指令代码,还有指令操作的各类数据等。遵循模块化程序设计思想,应将相关的代码安排在一起,将相关的数据安排在一起,于是段(Segment)的概念自然就出现了。一个段安排一类代码或数据。程序员在编写程序时,可以很自然地把程序的各部分放在相应的段中。对应用程序来说,主要涉及三类段:存放程序中指令代码的代码段(Code Segment)、存放当前运行程序所用数据的数据段(Data Segment)和指明程序使用的堆栈区域的堆栈段(Stack Segment)。

为了表明段在主存中的位置,16位80x86处理器有4个16位段寄存器:代码段寄存器CS、堆栈段寄存器SS、数据段寄存器DS和附加段寄存器ES。其中附加段(Extra Segment)也是用于存放数据的数据段,专为处理数据串设计的串操作指令必须使用附加段作为其目的操作数的存放区域。IA-32处理器又增加了两个同样是16位的段寄存器FS和GS,它们都属于数据段性质的段寄存器。

5.其他寄存器

简单的数据处理、实时控制领域一般使用整数,而科学计算等工程领域还要使用实数。在计算机中,采用浮点数据格式表达实数。进行浮点数据处理的硬件电路比整数处理单元复杂,称为浮点处理单元。与整数处理器类似,浮点处理单元也采用一些寄存器协助完成处理浮点数的指令操作。对程序员来说,组成IA-32浮点执行环境的寄存器主要是8个浮点数据寄存器(FPR0~FPR7),以及浮点状态寄存器、浮点控制寄存器、浮点标记寄存器等。

要快速处理大量的图形图像、音频、动画和视频等多种媒体形式的数据,整数和浮点指令已经很难胜任。IA-32处理器从奔腾开始,陆续加入了多媒体指令(SIMD指令)。配合处理整型多媒体数据的MMX技术支持8个64位的MMX寄存器(MM0~MM7);配合处理浮点多媒体数据的SSE技术支持8个128位的SIMD浮点数据寄存器(XMM0~XMM7)和控制状态寄存器(MXCSR)。

理解处理器工作原理、编写系统程序时需要了解系统专用寄存器。在保护方式下,这些寄存器由系统程序控制,通过一类所谓的“特权”指令来操作。例如,指向系统中特殊段的系统地址寄存器包括全局描述符表寄存器GDTR、中断描述符表寄存器IDTR、局部描述符表寄存器LDTR和任务状态段寄存器TR,它们用于支持存储管理。另外,还有5个控制寄存器CR n n =0~4),用于保存影响系统中所有任务的机器状态;以及用于内部调试的8个调试寄存器DR n n =0~7);等等。 vSMtryRWF0siRbDByNphTT0CZOA/zhr2TSGvWYPZwFjLOELhy5Abu3ZVjipDt5oS

点击中间区域
呼出菜单
上一章
目录
下一章
×