8个32位的常规目的寄存器
地址
| 名称
| 描述
|
EAX*
| 累加器
| 计算操作数和存放结果数据
|
EBX
| 基础寄存器
| 指向DS数据段的数据指针
|
ECX*
| 计数寄存器
| 字符串和循环操作的计数器
|
EDX*
| 数据寄存器
| 输入/输出指针
|
ESI
| 源索引
| 字符串操作的源地址指针
|
EDI
| 目的索引
| 字符串操作的目的地址指针
|
ESP
| 栈指针
| 栈指针,不能直接使用
|
EBP
| 基址指针
| 栈的数据指针
|
注意:尽管它们被称为通用寄存器,但只有标了‘*’号的寄存器能在Windows编程中通用。
6个16位的段寄存器,定义内存中的段
地址
| 名称
| 描述
|
CS
| 代码段
| 存储指令和执行的地方
|
DS, ES, FS, GS
| 数据段
| 数据段
|
SS
| 堆栈段
| 当前程序存储堆栈的地方
|
2个32位的不属于任何种类的寄存器
地址
| 名称
| 描述
|
EFLAGS
| 代码段
| 状态、控制和系统标志
|
EIP
| 指令指针
| 下一条将要执行指令的地址
|
基本指令集
X86指令非常多,但我们通常都无需全部用到。下面的一些简单指令是你一开始就要掌握的:
指令
| 描述
|
ADD* reg/memory, reg/memory/constant
| 将两个操作数作加法运算,并将结果存入到第一个操作数,如果有进位则会设置CF标志。
|
SUB* reg/memory, reg/memory/constant
| 从第一个操作数中减去第二个操作数,并将结果存入到第一个操作数中
|
AND* reg/memory, reg/memory/constant
| 在操作数之间执行逻辑位与运算,并将结果存入到第一个操作数中
|
OR* reg/memory, reg/memory/constant
| 在操作数之间执行逻辑位或运算,并将结果存入到第一个操作数中
|
XOR* reg/memory, reg/memory/constant
| 在操作数之间执行逻辑位异或运算,并将结果存入到第一个操作数中。注意不能XOR两个内存操作数。
|
MUL reg/memory
| 将操作数与累加器(eax)相乘,并将结果存入累加器
|
DIV reg/memory
| 从累加器中除以操作数,并将结果存入累加器
|
INC reg/memory
| 将操作数的值增1,并将结果存回到操作数中
|
DEC reg/memory
|