通用寄存器 |
EAX |
累加(Accumulator)寄存器 |
AX(AH、AL) |
常用于乘、除法和函数返回值 |
EBX |
基址(Base)寄存器 |
BX(BH、BL) |
常做内存数据的指针, 或者说常以它为基址来访问内存. |
ECX |
计数器(Counter)寄存器 |
CX(CH、CL) |
常做字符串和循环操作中的计数器 |
EDX |
数据(Data)寄存器 |
DX(DH、DL) |
常用于乘、除法和 I/O 指针 |
ESI |
来源索引(Source Index)寄存器 |
SI |
常做内存数据指针和源字符串指针 |
EDI |
目的索引(Destination Index)寄存器 |
DI |
常做内存数据指针和目的字符串指针 |
ESP |
堆栈指针(Stack Point)寄存器 |
SP |
只做堆栈的栈顶指针; 不能用于算术运算与数据传送 |
EBP |
基址指针(Base Point)寄存器 |
BP |
只做堆栈指针, 可以访问堆栈内任意地址, 经常用于中转 ESP 中的数据, 也常以它为基址来访问堆栈; 不能用于算术运算与数据传送 |
指令指针寄存器 |
EIP |
指令指针(Instruction Pointer)寄存器 |
总是指向下一条指令的地址; 所有已执行的指令都被它指向过. |
标志寄存器 |
EFLAGS |
标志(Flag)寄存器: EFLAGS 中的 32 位被分成 0-31 个二进制位分别使用; 第 0、2、4、6、7、11 位是状态标志位; 第 10 位是字符串操作控制标志位; 其他标志位一般不用或无权使用 |
0 |
CF |
进位(Carry)标志 |
目标无法容纳无符号算术运算的结果, 需要进位或借位时被设置; 可用 STC 指令设置, CLC 指令取消. |
1 |
|
|
|
2 |
PF |
奇偶(Parity)标志 |
低 8 位中有偶数个 1 时被设置 |
3 |
|
|
|
4 |
AF |
辅助(Auxiliary)标志 |
使用 BCD 码运算导致 3 位到 4 位产生进位时被设置 |
5 |
|
|
|
6 |
ZF |
零(Zero)标志 |
运算结果为 0 时被设置 |
7 |
SF |
符号(Sign)标志 |
运算结果为负数时被设置 |
8 |
|
|
|
9 |
|
|
|
10 |
DF |
方向(Direction)标志 |
字符串操作是从高位到低位时被设置; 可用 STD 指令设置, CLD 指令取消. |
11 |
OF |
溢出(Overflow)标志 |
因有符号运算的结果太宽而导致数据丢失时被设置 |
... |
|
|
|
31 |
|
|
|
... |
|
|
|
|
|
其中的 EAX、ECX、EDX 三个寄存器相对自由些, 所以练习时用它们较多.
没理会段寄存器: CS、DS、SS、ES、FS、GS, 是因在 Win32 保护模式下编程它们不再重要了.
还有 FPU、MMX 系列寄存器, 等用到再说吧.