文章目录
  1. 1. 通用寄存器
  2. 2. 变址寄存器
  3. 3. 指针寄存器
  4. 4. 标志寄存器

通用寄存器

  1. EAX寄存器:EAX称为累加器,常用于算数运算、布尔操作、逻辑操作、返回函数结果等。
  2. EBX寄存器:EBX称为基址寄存器,常用于存档内存地址。
  3. ECX寄存器:ECX称为计数寄存器,常用于存放循环语句的循环次数,字符串操作中也会常用。
  4. EDX寄存器:称为数据寄存器,常常和EAX一起使用。
    注意
    上面所述的4个通用寄存器的专门用途不是一成不变的,编译器在编译程序的时候会根据很多因素,例如编译器、编译条件、操作系统等做出相应的改变,读者要知道着手研究的程序是用什么编译器编译,然后针对具体的编译器参考该编译器的说明。

变址寄存器

顾名思义,变址的含义是内存地址会变动,也就是说变址寄存器中存放在变动的内存地址。80386架构中有两个变址寄存器,分别为ESI和EDI。

  1. ESI寄存器:称为源变址寄存器,通常存放要处理的数据的内存地址。
  2. EDI寄存器:称为目的变址寄存器,通常存放处理后的数据的内存地址。
    用途
    ESI和EDI通常用来配合使用完成数据的赋值操作,下面是一个EIS和EDI配合使用的例子。
    Rep movs dword ptr [edi],dword ptr [esi]
    上面的指令把ESI所指向的内存地址中的内容复制到EDI所指向的内存中,数据的长度在ECX寄存器中指定。

指针寄存器

80386的指针寄存器有基址寄存器EBP,堆栈指针寄存器ESP和指令指针寄存器EIP。只需要了解基址寄存器EBP和堆栈指针寄存器ESP即可,指令指针寄存器EIP总是指向下一条要执行的指令的地址,一般情况下无需修改EIP。

  1. EBP寄存器:称为基址寄存器,可作为通用寄存器用于存放操作数,常用来代替堆栈指针访问堆栈中的数据。
  2. ESP寄存器:称为堆栈指针寄存器,不可作为通用寄存器使用,ESP存放当前堆栈栈顶的地址,一般情况下,ESP和EBP联合使用来访问函数中的参数和局部变量。

用途
EBP和ESP常配合使用完成堆栈的访问,下面是一段常见的堆栈访问指令。
Push ebp
Mov ebp,esp
Sub esp,78
Push esi
Push edi
Cmp dword ptr [ebp+8],0

标志寄存器

  • OF(Overflow Flag):溢出标志,溢出时为1,否则置0。
  • DF (Direction Flag):方向标志,在串处理指令中控制信息的方向。
  • IF (Interrupt Flag) :中断标志
  • AF (Auxiliary carry Flag) :辅助进位标志,有进位时置1,否则置0。
  • ZF (Zero Flag) :零标志,运算结构为0时ZF位位置1,否则置0。
  • SF (Sign Flag):符号标志,结果为负时置1,否则置0。
  • CF (Carry Flag): 进位标志,进位时置1,否则置0。
  • PF (Parity Flag): 奇偶标志。结果操作数中1的个数为偶数时置1,否则置0。

正如上面所说EFLAGS是实现条件判断和逻辑判断的一种机制,在汇编语言中一般不直接访问EFLAGS寄存器,而是通过指令的操作隐含访问EFLAGS寄存器,下面是一个利用EFLAGS寄存器的例子。

Cmp dword ptr [ebp+8],0 ;影响标志CF、ZF、SF、OF、AF和PF
Jz 00405898 ; 如果ZF等于1,则跳转到00405898

文章目录
  1. 1. 通用寄存器
  2. 2. 变址寄存器
  3. 3. 指针寄存器
  4. 4. 标志寄存器