32位微处理器的编程结构

32位微处理器的寄存器模型,描述80386、80486及Pentium系列微处理器内部程序可见的寄存器结构。它兼容8086CPU原来的8个16位通用寄存器及原来的8个8位的寄存器,而且将原来的8个16位通用寄存器AX、BX、CX、DX、SI、DI、BP、SP均扩展成

32位的寄存器,即EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP。在32位微处理器中,既可以使用保留的8位和16位寄存器,还可以使用32位寄存器。除了8086 CPU的4个16位的段寄存器之外,还增加了2个16位的数据段寄存器FS和GS。

按照功能不同,寄存器可以分为通用寄存器、指令指针、标志寄存器及段寄存器4种类型。如何使用,后面章节介绍。

32位微处理器的编程结构

通用寄存器

共有8个32位通用寄存器,EAX、EBX、ECX、EDX、ESP、EBP、ESI和EDI,虽然它们都可以用于存放一般的数据,但是,不同的寄存器还可能有的书的用法,按照它们的功能差别,将其分为2组:

一组为通用数据寄存器;

另一组为指令指针与变址寄存器。

(1)通用数据寄存器

共计有4个32位的通用寄存器,EAX、EBX、ECX和EDX。通用数据寄存器一般用来存放8位、16位或32位的操作数。

EAX(Accumulator),累加器。EAX可以作为通用8位寄存器(AH和AL)、16位寄存器(AX)及32位寄存器(EAX)使用。

如果作为通用8位或16位寄存器使用时,则只改变EAX中低16位中相应的数据,其他位不改变。当CPU执行乘法指令、除法指令及调整指令时,EAX具有其固定的特殊用法。

EBX(Base),基址寄存器。EBX 可以作为通用8位寄存器(BH和BL)、16位寄存器(BX)及32位寄存器(EBX)使用。

如果作为通用8位或16位寄存器使用时,则只改变EBX中低16位中相应的数据,其他位不改变。在16位CPU中或32位机在实模式下,一般用BX存放存储单元的偏移地址。

ECX(Count),计数寄存器。ECX 可以作为通用8位寄存器(CH和CL)、16位寄存器(CX)及32位寄存器(ECX)使用。

如果作为通用8位或16位寄存器使用时,则只改变ECX中低16位中相应的数据,其他位不改变。

ECX有用于计数的固定用法,移位和循环指令一般用于CL寄存器计数,重复的串操作指令一般用CX计数,LOOP/LOOPD 等指令用CX或ECX计数。

EDX(Data),数据寄存器。EDX 可以作为通用8位寄存器(DH和DL)、16位寄存器(DX)及32位寄存器(EDX)使用。

如果作为通用8位或16位寄存器使用时,则只改变EDX中低16位中相应的数据,其他位不改变。

CPU执行乘法指令时,EDX固定用来存放部分乘机,CPU执行除法指令时,EDX固定用来存放被除数及余数等。

(2)指针及变址寄存器

4个32位的通用寄存器(ESP、EBP、ESI、EDI)都可以用作一般的32位数据寄存器,也可以用作一般的16位数据寄存器(SP、BP、SI、DI),

用作一般的16位数据寄存器时,与8086 CPU中的SP、BP、SI、DI兼容。另外,每个寄存器都有各自的专用场合。

ESP:32位的堆栈指针。以ESP位偏移地址,访问的是堆栈存储空间,一般用它来指向堆栈的栈底或栈顶。作16位使用时,与8086的SP堆栈指针兼容。

EBP:32位的基址指针,或称基址寄存器。以EBP位偏移地址,默认访问的是堆栈存储空间,一般用它来存放偏移地址,以便访问堆栈区。作16位使用时,与8086的基址指针BP兼容。

ESI:32位的源变址寄存器。ESI(或16位的SI)用于寻址串操作指令的圆数据串。

EDI:32位的目的变址寄存器。EDI(或16位的DI)用于寻址串操作指令的目的数据串。

指令指针

扩展的指令指针(EXtended Instruction Pointer,EIP)是一个32位的专用寄存器,专用于寻址当前需要取出的指令码。当CPU从代码段取出一字节指令后,EIP就自动加一,指向下一字节的指令码。

当80386及以上的32位微处理器工作在保护模式下时,EIP的32位都有效;当工作在实模式下时,32位的EPI仅低16位(IP)有效,与8086兼容。

标志寄存器

32位的标志寄存器(EFLAGS)用于指示微处理器进行算术运算和逻辑运算后的状态及控制微处理器的有关操作。80x86及Pentium系列微处理器标志寄存器的低16位时8086CPU的标志寄存器。

随着微处理器的发展,相应的标志寄存器的位数在进行扩充,8086及80286CPU都只具有16位的标志寄存器,从80386到Pentium位处理器采用了32位的标志寄存器。

EFLAGS在8086的16位EFLAGS基础上扩充了高16位,其中,EFLAGS的b11~b0中保留了8086CPU中6个状态标志和3个控制状态,增加了NT与IOPL标志,高16位中新增了6个标志位,这些扩充标志位含义:

1)NT,嵌套任务标志。当该位置被置成1时,表示当前所执行的任务正嵌套在另一任务中,该位的置1与清零都是通过任务的控制转移来实现的,显然,NT用于保护模式。

2)IOPI,I/O特权级别。用来表示I/O操作处于0~3级特权的哪一级,0级最高,3级最低,它是用于指明在保护模式下不产生异常中断13而执行I/O指令时,要求当前特权级CPL的允许值。

3)RF(Resume Flag),恢复标志。它是一个与单步、断点调试一起使用的标志。该位置1时,即使遇到断点或调试故障,也不产生异常中断1(即单步中断)。成功执行完一条指令后,该位会自动清零。

4)VM(Virtual 8086 Mode),虚拟86方式标志位。在保护模式下,若VM置1,CPU则转移到虚拟8086模式。在此模式下,CPU像一个告诉的8086 CPU运行8086的指令,一旦返回保护模式后,此位清零。

5)AC,对准检查标志位。AC标志仅对特权级3的程序即用户程序有效,若AC=1,且系统级控制寄存器中AM位也为1状态时,才允许对特权级3的程序进行数据的对准检查,而且必须检查。

若AC=0,则不允许对准检查。一旦CPU未对准地址而访问内存时,将产生异常中断17.

6)VIF,虚拟中断标志位。在虚拟86方式下,VIF是中断标志IF的复制。

7)VIP,虚拟中断位。指示是否有挂起的中断,当VIP=1时,表示有一个中断正等待响应与处理。VIP与VIF都起到控制虚拟中断的作用。

8)ID,识别标志位。如果该标志位能被置位和清零,则指明这个处理器能支持CPUID指令。CPUID指令可以提供该处理器的厂商、系列及模式等信息。

上述的8位标志位中,前5个标志位在80486 CPU中就已经存在了,后3个标志位是Pentium处理器新增加的。

6个16位的段寄存器

32位微处理器包含六个16位的段寄存器,其中,包括8086CPU的四个段寄存器:代码段寄存器CS、数据段寄存器DS、附加数据段寄存器ES、堆栈段寄存器SS

在实模式下,这四个段寄存器的使用与8086的兼容,即段寄存器中的二进制值左移4位,低4位补4个0后,再加上段内的偏移地址形成20位的物理地址。

但在保护模式下,它们作为段描述符,经过段页式变换后才能产生物理地址。

32位微处理器新增加2个16位的段寄存器: FS和GS,这是2个附加的数据段寄存器。


分享到:


相關文章: