题记
因工作中经常用到反汇编解一些算法,故对次有一定的接触,为了更进一步理解C、C++、VC等他们的特性,记下一些东西,就当自娱自乐了。
汇编初步
1 80x86汇编
1.1 寄存器
32位CPU所含有的寄存器分类简介:
1.1.1 数据寄存器(EAX、EBX、ECX和EDX)
数据寄存器主要用来保存操作数和运算结果等信息。
寄存器的低16位分别是:AX、BX、CX和DX,每个16位寄存器又可以分为两个8位寄存器。
32位寄存器 | EAX | EBX | ECX | EDX | ||||||||
16位寄存器 | --- | AX | --- | BX | --- | CX | --- | DX | ||||
8位寄存器 | --- | AH | AL | --- | BH | BL | --- | CH | CL | --- | DH | DL |
1.1.2 2个变址寄存器(ESI和EDI)
低16位分别是SI和DI。通常在串操作中,ESI保存源地址,EDI保存目标地址。
1.1.3 2个指针寄存器(ESP和EBP)
低16位分别是SP和BP。
ESP是堆栈指针寄存器,保存堆栈指针,永远指向栈顶;EBP保存基址指针。
1.1.4 6个段寄存器(ES、CS、SS、DS、FS和GS)
ECS——代码段寄存器(Code Segment Register),其值为代码段的段值;
EDS——数据段寄存器(Data Segment Register),其值为数据段的段值;
EES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
ESS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;
EFS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
EGS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。
1.1.5 1个指令指针寄存器(EIP)
指向下一条将要执行的指令
1.1.6 1个标志寄存器(EFlags)
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|
|
|
| OF | DF | IF | TF | SF | ZF |
| AF |
| PF |
| CF |
运算结果标志包括以下6位:
OF(Overflow Flag)溢出标志,在运算过程中,如操作数超出了机器能表示的范围,则称为溢出。此时OF位置1,否则置0。
SF(Sign Flag)符号标志,记录运算结果的符号,结果为负时置1,否则置0。
ZF(Zero Flag)零标志,运算结果为0时ZF位置1,否则置0。
CF(Carry Flag)进位标志,记录运算时有效位产生的进位值。例如,执行加法指令时,最高有效位有进位时置1,否则置0。
AF(Auxiliary carry Falg)辅助进位标志,记录运算时第3位(半个字节)产生的进位值。例如,执行加法指令时第3位有进位时置1,否则置0。
PF(Parity Flag)奇偶标志,用来为机器中传送信息时可能产生的代码出错情况提供检验条件。当结果操作数中1的个数为偶数时置1,否则置0。
控制标识位有三个:
DF(Direction Flag)方向标志,在串处理指令中控制处理信息的方向用。当DF位为1时,每次操作后是变址寄存器SI和DI减量,这样就是串处理从高地址向低地址方向处理。当DF为0时,则使SI和DI增量,使串处理从低地址向高地址方向处理。8086/8088提供的专门用于设置方向标志DF的指令是STF,专门用于清除DF的指令时CLD。
IF(Interrupt Flag)中断向量,当IF为1时,允许中断,否则关闭中断。有关中断原理将在后面详细讲解。8086/8088提供的专门用于设置中断允许标志IF的指令是STI,专门用于清IF的指令是CLI。
TF(Trap Flag)追踪标志,用于单步操作方式,当追踪标志TF被置1后,CPU进入单步方式。所谓单步方式是指在一条指令执行后,产生一个单步中断,这主要用于程序的调试。