现在的位置: 首页 > 综合 > 正文

x86 寄存器

2014年10月04日 ⁄ 综合 ⁄ 共 3555字 ⁄ 字号 评论关闭

i386的寄存器

   80386作为80X86系列中的一员,必须保证向后兼容,也就是说,既要支持16位的处理器,也要支持32位的处理器。在8086中,所有的寄存器都是16位的,下面我们来看一下80386中寄存器有何变化:

·      16位的通用寄存器、标志寄存器以及指令指针寄存器扩充为32位的寄存器

·      段寄存器仍然为16位。

·      增加432位的控制寄存器

·      增加4个系统地址寄存器

·      增加8个调式寄存器

·      增加2个测试寄存器

 

 

 

 

2、状态和控制寄存器

状态和控制寄存器是由标志寄存器EFLAGS、指令指针EIP4个控制寄存器组成,如图2.1所示:

标志寄存器

指令指针

机器状态字

Intel保留

页故障地址

页目录地址

 


                                                       EFLAGS

                                                       EIP

                                                       CR0

                                                       CR1

                                                       CR2

                                                       CR3

                           

                                   2.1状态和控制寄存器

 1.指令指针寄存器和标志寄存器

   指令指针寄存器EIP中存放下一条将要执行指令的偏移量(offset ),这个偏移量是相对于目前正在运行的代码段寄存器CS而言的。偏移量加上当前代码段的基地址,就形成了下一条指令的地址。EIP中的低16位可以分开来进行访问,给它起名叫指令指针IP寄存器,用于16位寻址。

   标志寄存器EFLAGS存放有关处理器的控制标志,如图2.2所示。标志寄存器中的第13515位及1831位都没有定义。

 

 

 

 

 

 

 1.调试寄存器

80386为调试提供了硬件支撑。在80386芯片内有832位的调试寄存器DR0~DR7,如图2.2所示。

     这些寄存器可以使系统程序设计人员定义4个断点,用它们可以规定指令执行和数据读写的任何组合。DR0~DR3是线性断点地址寄存器,其中保存着4个断点地址。DR5DR6是两个备用的调试寄存器,目前尚未定义。DR6是断点状态寄存器,其低序位是指示符位,当允许故障调试并检查出故障而进入异常调试处理程序(debug())时,由硬件把指示符位置1,调试异常处理程序在退出之前必须把这几位清0DR7是断点控制寄存器,它的高序半个字又被分为4个字段,用来规定断点字段的长度是1个字节、2个字节、4个字节及规定将引起断点的访问类型。低序半个字的位字段用于“允许”断点和“允许”所选择的调试条件。

 

 

线性断点地址0

 

   线性断点地址1

 

  线性断点地址2

  线性断点地址3

 

Intel保留

Intel保留

 

断点状态

断点控制

DR0

 

DR1

 

DR2

DR3

 

DR5

DR6

 

DR7

DR8
                                                                       

 

              

                 2.2 80386的调试寄存器

 2. 测试寄存器

   80386有两个32位的测试寄存器TR6TR7。这两个寄存器用于在转换旁视缓冲器Translation Lookaside Buffer)中测试随机存储器(RAM)和相联存储器(CAM)。TR6是测试命令寄存器,其内存放测试控制命令。TR7是数据寄存器,其内保存转换旁路缓冲器测试的数据。

 

 

4、系统地址寄存器

  803864个系统地址寄存器,如图2.2所示,它保存操作系统要保护的信息和地址转换表信息:

      47   32位基地址  16 15  界限     0

 

 

 

 

GDTR

 

IDTR

                                                          TR
                                                                                            

 

 

LDTR


                                                                                                                                                                                   

                                                                                          

                          图2.2   80386系统地址寄存器

4个专用寄存器用于引用在保护模式下所需要的表和段,它们的名称和作用如下:

·      全局描述符表寄存器GDTRGlobal Descriptor Table Register ),是48位寄存器,用来保存全局描述符表(GDT)的32位基地址和16GDT的界限。

·      中断描述符表寄存器IDTRInterrupt Descriptor Table Register),是48位寄存器,用来保存中断描述符表(IDT)的32位基地址和16IDT的界限。

·      局部描述符表寄存器LDTRGlobal Descriptor Table Register ),是16位寄存器,保存局部描述符表LDT段的选择符。

·      任务状态寄存器TRTask State Register)是16位寄存器,用于保存任务状态段TSS段的16位选择符。

    用以上4个寄存器给目前正在执行的任务(或进程)定义任务环境、地址空间和中断向量空间。有关全局描述符表GST、中断描述符表IDT、局部描述符表LDT及任务状态段TSS的具体内容将在稍后进行详细描述。

 

5 调试寄存器和测试寄存器

 

3、段寄存器

8086中有416位的段寄存器:CSDSSSES,分别用于存放可执行代码的代码段、数据段、堆栈段和其他段的基地址。在80386中,有616位的段寄存器,但是,这些段寄存器中存放的不再是某个段的基地址,而是某个段的选择符(Selector)。因为16位的寄存器无法存放32位的段基地址,段基地址只好存放在一个叫做描述符表(Descriptor)的表中。因此,在80386中,我们把段寄存器叫做选择符。下面给出6个段寄存器的名称和用途:

CS  代码段寄存器

DS  数据段寄存器

SS  堆栈段寄存器

ESFSGS  附加数据段寄存器

有关段选择符、描述符表及系统表地址寄存器将在段机制一节进行详细描述。

 

1、通用寄存器

 8个通用寄存器是8086寄存器的超集,它们的名称和用途分别为:

 EAX  一般用作累加器

 EBX  一般用作基址寄存器(Base

 ECX  一般用来计数(Count

 EDX  一般用来存放数据(Data

 EBP  一般用作堆栈指针(Stack Pointer

 EBP  一般用作基址指针(Base Pointer

 ESI   一般用作源变址(Source Index

 EDI   一般用作目标变址(Destinatin Index

      8个通用寄存器中通常保存32位数据,但为了进行16位的操作并与16为机保持兼容,它们的低位部分被当成816位的寄存器,即AXBX…DI。为了支持8位的操作,还进一步把EAXEBXECXEDX这四个寄存器低位部分的16位,再分为8位一组的高位字节和低位字节两部分,作为88位寄存器。这8个寄存器分别被命名为AHBHCHDHALBLCLDL。对8位或16位寄存器的操作只影响相应的寄存器。例如,在做8位加法运算时,位7的进位并不传给目的寄存器的位9,而是把标志寄存器中的进位标志(CF)置位。因此,这8个通用寄存器既可以支持1位、8位、16位和32位数据运算,也支持16位和32位存储器寻址。

抱歉!评论已关闭.