汇编语言——寄存器介绍
了解EAX、EBX、ECX和EDX寄存器以及对应的16位寄存器
IA-32架构中一共有4个32位寄存器,用于保存临时数据,它们分别是EAX、EBX、ECX和EDX。
这4个32位寄存器的通用寄存器名字前面都有一个“E”字母,含义是“Expand”扩展,这是由于在16位的时代,这4个通用寄存器的名字是AX、BX、CX和DX,到了32位后就在它们的名字前面加个“E”来区别是32位还是16位。
这4个32位的通用寄存器可以当作16位使用,也可以当作8位使用。当作8位使用时,就将AX折开为AH和AL,AH中的“H”代表“high”,意思是高位的意思,AL中的“L”代表“low”,意思是地位的意思。同理,BX、CX和DX可折开为BH、BL、CH、CL、DH、DL来使用。

一些寄存器是别的寄存器的一部分:例如,如果EAX保存了值12782345,这里是其他寄存器的值。

学习EAX、EBX、ECX和EDX寄存器的用途
(1)EAX寄存器:EAX称为累加器,常用于算数运算、布尔操作、逻辑操作、返回函数结果等。
(2)EBX寄存器:EBX称为基址寄存器,常用于存档内存地址。
(3)ECX寄存器:ECX称为计数寄存器,常用于存放循环语句的循环次数,字符串操作中也常用。
(4)EDX寄存器:称为数据寄存器,常常和EAX一起使用。
注意:上面所述的4个通用寄存器的专门用途不是一成不变的,编译器在编译程序的时候会根据很多因素,例如编译器、编译条件、操作系统等做出相应的改变,读者要知道着手研究的程序是用什么编译器编译,然后针对具体的编译器参考该编译器的说明。
学习变址寄存器——ESI和EDI寄存器与其用途
变址寄存器
顾名思义,变址的含义是内存地址会变动的,也就是说变址寄存器中存放在变动的内存地址。80386架构中有两个变址寄存器,分别是ESI和EDI。
ESI和EDI寄存器:
(1)ESI:ESI称为源变址寄存器,通常存放要处理的数据的内存地址。
(2)EDI:EDI称为目的变址寄存器,通常存放处理后的数据的内存地址。
ESI和EDI寄存器的用途
ESI和EDI常用来配合使用完成数据的赋值操作,下面是一个ESI和EDI配合使用的例子。
Rep movs dword ptr [edi],dword ptr [esi]
上面的指令把ESI所指向的内存地址中的内容复制到EDI所指向的内存中,数据的长度在ECX寄存器中指定。
学习指针寄存器-EBP和ESP寄存器与其用途
指针寄存器
80386的指针寄存器有基址寄存器EBP,堆栈指针寄存器ESP和指令指针寄存器EIP。只需要了解基址寄存器EBP和堆栈指针寄存器ESP即可,指令指针寄存器EIP总是指向下一条要执行的指令的地址,一般情况下无需修改EIP。
EBP和ESP寄存器
(1)EBP:EBP称为基址寄存器,可作为通用寄存器用于存放操作数,常用来代替堆栈指针访问堆栈中的数据。
(2)ESP:ESP称为堆栈指针寄存器,不可作为通用寄存器使用,ESP存放当前堆栈栈顶的地址,一般情况下,ESP和EBP联合使用来访问函数中的参数和局部变量。
EBP和ESP寄存器的用途:
EBP和ESP常配合使用完成堆栈的访问,下面是一段常见的堆栈访问指令。
Push ebp
Mov ebp,esp
Sub esp,78
Push esi
Push edi
Cmp dword ptr [ebp+8],0
学习标志寄存器-EFLAGS寄存器与其用途
标志寄存器EFLAGS一共有32位,在这32位中大部分是保留和给编写操作系统的人用的,一般情况下只需知道32位的低16位中的8位即可,图1-3列出了标志寄存器EFLAGS中需要了解的8个位的位置。
* 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寄存器,下面是一个利用EFLAGS寄存器的例子。
Cmp dword ptr [ebp+8],0 ;影响标志CF、ZF、SF、OF、AF和PF
Jz 00405898 ; 如果ZF等于1,则跳转到00405898
