b50b46fd122449cfbf0ba5f5ccbbf921.jpg
Intel x86 处理器使用复杂指令集计算机 (CISC) 架构,这意味着专用寄存器数量适中,而不是大量通用寄存器。这也意味着复杂的专用指令将占主导地位。
x86 处理器至少可以追溯到 8 位英特尔 8080 处理器。x86 指令集中的许多特性是由于与该处理器(及其 Zilog Z-80 变体)的向后兼容性。
寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。寄存器是直接位于cpu内的高速存储位置,其设计访问速度远高于其他的存储器。
x86寄存器.png

通用寄存器

x86执行单元包括8个32位的通用寄存器,这些寄存器只要是用来做逻辑,算术和地址的计算,也可以用他们存放临时数据或者指向内存数据的指针。出了支持32位操作数外,也可以通过寄存器来存放8位或者16位操作数,通过32位寄存器对应的16位寄存器或者8位寄存器达到操作16位和8位的操作数。

image.png
尽管都叫通用寄存器,但一些指令需要隐含使用特定的寄存器,例如,执行循环指令loop,它以ecx寄存器作为计算寄存器等。

  1. EAX: cpu默认使用EAX寄存器作为乘法指令的目的操作数,它被称为扩展累加器。在高级语言中。使用EAX寄存器作为函数调用的返回值。
  2. EBX: 在内存寻址时存放基地址
  3. ECX: cpu默认使用ECX寄存器作为循环计数器。
  4. EDX: 用来放整数除法产生的余数
  5. EBP/ESP: 用于扩展堆栈空间。在高级语言中用于存放局部变量,函数参数列表
  6. ESI/EDI: ESI和EDI用于告诉存储器传输指令。

    指令寄存器

  7. EIP:指令寄存器中包含了下一条将要执行的指令地址。不能通过执行取修改EIP寄存器值。只能通过执行 callret指令,cpu在内部中再去修改EIP寄存器的值。

    段寄存器

    segmentation.png
    段寄存器是因为cpu对内存的分段管理而设置的。cpu需要对内存进行分段管理,例如把程序划分为全局变量区域,只读变量,代码段,堆栈段等。以限制程序对数据的访问,再实模式下,16位段寄存器表示的是预先分配分配的内存区域的基址,这个内存区域称为段,再保护模式下,段寄存器保存的是段描述符表指针,一些段中存放程序指令。其他段存放数据,堆栈段存放临时变量和函数参数等。在描述内存分段时,需要有如下段的信息:

  8. 段的大小;

  9. 段的起始地址;
  10. 段的管理属性(禁止写入/禁止执行/系统专用等)

x86寄存器 - 图5
段寄存器在不同的cpu模式(实模式,保护模式)下,意义是不同的,但不管在那个模式下,段寄存器都是存放着段的地址和数据。

  1. CS: 代码段寄存器(code segment register),其值为代码段的段基地址。eip寄存器存放的是相对与代码段偏移值。所以cpu通过cs + eip可以获取到 下一个执行的指令的位置。
  2. DS: 数据段寄存器(data segment register),其值为数据段的段基地址。
  3. ES: 附加段寄存器(extra segment register),其值为附加数据段的段基地址,称为附加是因为此段寄存器用途不像段寄存器那样固定作用。它可以做额外的使用。
  4. FS: 附加段寄存器(extra segment register)作用和es寄存器一样。用途不固定。
  5. GS: 附加段寄存器(extra segment register)作用和es寄存器一样。用途不固定。
  6. SS: 堆栈段寄存器(stack segment register),其值为堆栈段的段值。在程序初始化的时候ss寄存器ebp寄存器存放的地址一样。

    标记寄存器

    image.png
    EFLAGS寄存器包含了独立的二进制位,用于控制cpu的操作或反央一些操作结果,有些指令可以测试和控制这些单独的处理器标记位。

    系统标记位

    系统标记位在保护模式下不能使用,只能在实地址模式下使用。

    控制标记位

    控制标志位控制cpu的操作,例如他们能使cpu每执行一条指令后进入中断,在侦测到算数运算溢出时中断。程序能够设置FLAGS寄存器的单独位来控制cpu的操作。比如,方向标志位和中断标志位。

  7. 陷阱标志位-TF(trap falgs): 程序调试而设的。当设置TF=1,CPU处于单步执行指令的方式;当设置TF=0时,CPU正常执行程序。

  8. 中断标志位-IF(interrupt flags): 当设置IF=1,开中断,CPU可响应可屏蔽中断请求;当设置IF=0时,关中断,CPU不响应可屏蔽中断请求。操作系统使用中断实现系统调用。
  9. 方向标志位-DF(direction flas): 用来控制数据串操作指令的步进方向;当设置DF=1时,将以递减顺序对数据串中的数据进行处理。当设置DF=0时,递增。

    状态标记位

    状态标志位反央了cpu执行算数和逻辑操作的结果。

  10. 进位标志位-CF(carry flags): 无符号运算结果值太大,设置该标志位。

  11. 溢出标志位-OF(overflow flags): 有符号运算结果过太大或者太小,设置该标志位。
  12. 符号标志位-SF(sign flags): 算术或者逻辑操作产生的结果为负结果过的时候,设置该标记位。
  13. 0标记位-ZF(zero flags): 算术或者逻辑操作产生的结果为0的时候设置该标记位。
  14. 辅助进位标记位-AF(auxiliary flags): 算术操作在8位操作数中产生了位3和位4的进位的时候这是该标记位。
  15. 奇偶校验标记位-PF(parity check flags):结果的最低有效字节包含偶数1时,设置该标记位,否则清除该标记位。一般情况下如果有数据被修改或损坏的时候,该标记位用于进行错误检测。