x86寄存器包括:

1.通用寄存器(8个)
2.段寄存器(6个)
3.指令指针寄存器
4.标志寄存器
5.系统地址寄存器(4个)
6.控制寄存器、调试寄存器、测试寄存器、浮点寄存器
本文只介绍前5种寄存器。

通用寄存器(可兼容8位或16位CPU)

  1. EAX: (accumulator)累加器,可以作为加法、乘法指令的缺省寄存器;可以存放函数返回值。
  2. ECX: (counter)计数器,是rep指令、loop指令的默认计数器。
  3. EDX: (data)数据,可用来存放整数除法产生的余数。
  4. EBX: 基地址寄存器。

以上4个32位寄存器有时会作为16位或8位寄存器使用,对应的名称为:AX、CX、DX、BX、AH、AL、CH、CL、DH、DL、BH、BL
5. EBP: (base pointer)堆栈基指针。
6. ESP: (stack pointer)堆栈指针,指向当前栈顶。
7. ESI/EDI: (source/destination index)源/目标变址,在字符串操作指令种,DS:ESI指向源字符串,ES:EDI指向目标字符串。
后面这些寄存器有时会作为16为寄存器使用,但不会作为8位寄存器使用

段寄存器


两个作用:

  1. 在实模式下,段寄存器就作为16位的段地址来配合偏移量进行访存。
  2. 在保护模式下,段寄存器作为段选择子,通过访问描述符表来获得相应的段基址。

  1. CS: 代码段
  2. DS: 数据段
  3. ES: 附加段
  4. SS: 堆栈段
  5. FS: 附加段
  6. GS: 附加段

注:在16位CPU系统中,只有4个段寄存器,所以程序在任何时刻至多有4个正在使用的段可以直接访问;在32位CPU系统中,有6个段寄存器,可同时访问6个段。


指令指针寄存器

EIP: 在16位时为IP,存放下次要执行的指令在代码段的偏移量。

标志寄存器(EFLAGS)

状态标志位

  1. CF: (carry flag)若算术操作产生的结果在最高有效位发生进位或借位,则将其置为1,反之清0。
  2. PF: (parity flag)若算术运算结果的最低有效字节包含偶数个1位则该位置1,否则清0。
  3. ZF: (zero flag) 若结果为0则将其置1,反之清0。
  4. SF: (sign flag) 该标志设置为有符号整型的最高有效位,0表示结果为正,反之为负。
  5. OF: (overflow flag) 如果运算结果时较大的整数或较小的负数,并且无法匹配目的操作数时将该位置1,反之清0,标志为带符号整型运算指示溢出状态。

DF标志

这个方向标志用来指示字符串指令(MOVS,CMPS,SCAS,LODS,STOS)的具体处理方向,若DF位为1,则串指令自动递减(从高地址向低地址方向处理字符串),若DF位为0,则串指令自动递增。
STD、CLD 分别用来设置和清除DF标志。

系统地址寄存器

  1. GDTR: 全局描述符表寄存器,48位,用来存放全局描述符表GDT的32位线性基地址和16位界限值。在全局描述符表中不仅包括有OS使用的描述符,还有所有任务使用的公用描述符。
  2. IDTR: 中断描述符表寄存器,48位,用来存放中断描述符表IDT的32位线性基地址和16位的界限值。
  3. LDTR: 局部描述符表寄存器,16位,用来存放局部描述符表LDT的16位选择符。
  4. TR: 任务状态寄存器,用来存放任务状态段TSS的16位选择符。

持续更新。。。。