I386 寄存器


通用寄存器 (8) 32bits

 EAX  累加器

 EBX  基址寄存器(Base)

 ECX  计数(Count)

 EDX  存放数据(Data)

 EBP  堆栈指针(Stack Pointer)

 EBP  基址指针(Base Pointer)

 ESI   源变址(Source Index)

 EDI   目标变址(Destinatin Index)

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

 

段寄存器 (6) 16bits

CS     代码段寄存器

DS    数据段寄存器

SS     堆栈段寄存器

ES     FS     GS附加数据段寄存器

 

状态和控制寄存器 (6) 32bits

EIP指令指针寄存器中存放下一条将要执行指令的偏移量(offset ),这个偏移量是相对于目前正在运行的代码段寄存器CS而言的。偏移量加上当前代码段的基地址,就形成了下一条指令的地址。

EFLAGS 标志寄存器

第8位TF(Trap Flag)是自陷标志,当将其置1时则可以进行单步执行。当指令执行完后,就可能产生异常1的自陷(参看第四章)。也就是说,在程序的执行过程中,每执行完一条指令,都要由异常1处理程序 (在Linux内核中叫做debug())进行检验。当将第8位清0后,且将断点地址装入调试寄存器DR0~DR3时,才会产生异常1的自陷。                                  

第12、13位IOPL是输入输出特权级位,这是保护模式下要使用的两个标志位。由于输入输出特权级标志共两位,它的取值范围只可能是0、1、2和3共4个值,恰好与输入输出特权级0~3级相对应。但Linux内核只使用了两个级别,即0和3级,0表示内核级,3表示用户级。在当前任务的特权级CPL(Current Privilege Level)高于或等于输入输出特权级时,就可以执行像IN、OUT、INS、OUTS、STI、CLI和LOCK等指令而不会产生异常13(即保护异常)。在当前任务特权级CPL为0时,POPF(从栈中弹出至标志位)指令和中断返回指令IRET可以改变IOPL字段的值。

第9位IF(Interrupt Flag)是中断标志位,是用来表示允许或者禁止外部中断(参看第四章)。若第9位IF被置为1,则允许CPU接收外部中断请求信号;若将IF位清0,则表示禁止外部中断。在保护模式下,只有当第12、13位指出当前CPL为最高特权级时,才允许将新值置入标志寄存器EFLAGS以改变IF位的值。

第10位DF(Direction Flag)是定向标志。DF位规定了在执行串操作的过程中,对源变址寄存器ESI或目标变址寄存器EDI是增值还是减值。如果DF为1,则寄存器减值;若DF为0,则寄存器值增加。

第14位NT是嵌套任务标志位。在保护模式下常使用这个标志。当80386在发生中断和执行CALL指令时就有可能引起任务切换。若是由于中断或由于执行CALL指令而出现了任务切换,则将NT置为1。若没有任务切换,则将NT位清0。

第17位VM (Virtual 8086 Mode Flag)是虚拟8086方式标志,是80386新设置的一个标志位。表示80386CPU是在虚拟8086环境中运行。如果80386CPU是在保护模式下运行,而VM为又被置成1,这时80386就转换成虚拟8086操作方式,使全部段操作就像是在8086CPU上运行一样。VM位只能由两种方式中的一种方式给予设置,即或者是在保护模式下,由最高特权级(0)级代码段的中断返回指令IRET设置,或者是由任务转换进行设置。Linux内核实现了虚拟8086方式,但在本书中我们不准备对此进行详细讨论。

 

CR0  保护允许位PE(Protedted Enable),用于启动保护模式,如果PE位置1,则保护模式启动,如果PE=0,则在实模式下运行。分页允许位(Paging Enable),它表示芯片上的分页部件是否允许工作。

CR1是未定义的控制寄存器,供将来的处理器使用。

CR2是页故障线性地址寄存器,保存最后一次出现页故障的全32位线性地址。

CR3是页目录基址寄存器,保存页目录表的物理地址,页目录表总是放在以4K字节为单位的存储器边界上,因此,它的地址的低12位总为0。

 

系统地址寄存器 (4) 48bits/16bits

GDTR全局描述符表寄存器是48bits寄存器,用来保存全局描述符表(GDT)的32bits基地址和16bitsGDT的界限。

IDTR中断描述符表寄存器是48bits寄存器,用来保存中断描述符表(IDT)的32bits基地址和16bitsIDT的界限。

LDTR局部描述符表寄存器是16bits寄存器,保存局部描述符表LDT段的选择符。

TR任务状态寄存器是16bits寄存器,用于保存任务状态段TSS段的16bits选择符。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值