汇编基础学习笔记
菜鸟最近才刚刚开始学习逆向,做了一些汇编的笔记,如下:
1 . 32位通用寄存器
- 数据寄存器EAX, EBX, ECX, EDX.
EAX:累加寄存器,是很多加法乘法指令的缺省寄存器
EBX:基址寄存器,在内存寻址时存放基地址
ECX:计数寄存器,是重复(REP)前缀指令和LOOP指令的内定计数器
EDX:数据寄存器,总是被用来放整数除法产生的余数.
- 段寄存器
CS:代码段寄存器 ES:附加段寄存器
DS:数据段寄存器 FS:附加段寄存器
SS:堆栈段寄存器 GS:附加段寄存器
- 索引寄存器ESI, EDI
ESI:源索引寄存器
EDI:目的索引寄存器
在很多字符串操作指令中,DS:ESI指向源串,而ES:EDI指向目标串
- 指令指针寄存器
EIP:指令指针寄存器,存储的是CPU下次要执行的指令的地址.
- 指针寄存器
EBP为基指针寄存器,用它可直接存取堆栈中的数据。
ESP为堆栈指针寄存器,用它只可访问栈顶。
- 标志寄存器
进位标志CF(Carry Flag):
进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。
奇偶标志PF(Parity Flag):
奇偶标志PF用于反映运算结果中“1”的个数(二进制)的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。
辅助进位标志AF(Auxiliary Carry Flag)
在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:
(1)、在字操作时,发生低字节向高字节进位或借位时;
(2)、在字节操作时,发生低4位向高4位进位或借位时。
零标志ZF(Zero Flag)
零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。
符号标志SF(Sign Flag)
符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。
溢出标志OF(Overflow Flag)
溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。
追踪标志TF(Trap Flag)
当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。
指令系统中没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。
中断允许标志IF(Interrupt-enable Flag)
中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。具体规定如下:
(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;
(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。
方向标志DF(Direction Flag)
方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。具体规定在第5.2.11节——字符串操作指令——中给出。在微机的指令系统中,还提供了专门的指令来改变标志位DF的值。
2. 常用的32汇编指令
-
ADD :加法
-
ADC :带位加法
-
SBB :带位减法
-
SUB:减法.
-
INC :加法.
-
CMP :比较.(两操作数作减法,仅修改标志位,不回送结果).
-
AND :与运算.
-
OR :或运算.
-
XOR :异或运算.
-
NOT :取反.
-
MOV:传送字或字节.
-
MOVSX:先符号扩展,再传送.
-
PUSH:把字压入堆栈.
-
POP:把字弹出堆栈.
-
PUSHA:把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
-
POPA : 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
-
PUSHAD : 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
-
POPAD : 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
-
LEA : 装入有效地址. 例: LEA DX,0xAA //把0xAA地址存到DX.
-
JMP :无条件转移指令
-
CALL:过程调用 .
-
RET/RETF : 过程返回.
-
JCC指令:
JCC指令 | 含义 | 英文 | 检查符号位 | C语句 |
---|---|---|---|---|
JZ/JE | 若为0则跳转;若相等则跳转 | jump if zero;jump if equal | ZF=1 | if (i == j);if (i == 0); |
JNZ/JNE | 若不为0则跳转;若不相等则跳转 | jump if not zero;jump if not equal | ZF=0 | if (i != j);if (i != 0); |
JS | 若为负则跳转 | jump if sign | SF=1 | if (i < 0); |
JNS | 若为正则跳转 | jump if not sign | SF=0 | if (i > 0); |
JP/JPE | 若1出现次数为偶数则跳转 | jump if Parity (Even) | PF=1 | / |
JNP/JPO | 若1出现次数为奇数则跳转 | jump if not parity (odd) | PF=0 | / |
JO | 若溢出则跳转 | jump if overflow | OF=1 | / |
JNO | 若无溢出则跳转 | jump if not overflow | OF=0 | / |
JC/JB/JNAE | 若进位则跳转;若低于则跳转;若不高于等于则跳转 | jump if carry;jump if below;jump if not above equal | CF=1 | if (i < j); |
JNC/JNB/JAE | 若无进位则跳转;若不低于则跳转;若高于等于则跳转; | jump if not carry;jump if not below;jump if above equal | CF=0 | if (i >= j); |
JBE/JNA | 若低于等于则跳转;若不高于则跳转 | jump if below equal;jump if not above | ZF=1或CF=1 | if (i <= j); |
JNBE/JA | 若不低于等于则跳转;若高于则跳转 | jump if not below equal;jump if above | ZF=0或CF=0 | if (i > j); |
JL/JNGE | 若小于则跳转;若不大于等于则跳转 | jump if less;jump if not greater equal jump | SF != OF | if (si < sj); |
JNL/JGE | 若不小于则跳转;若大于等于则跳转; | jump if not less;jump if greater equal | SF = OF | if (si >= sj); |
JLE/JNG | 若小于等于则跳转;若不大于则跳转 | jump if less equal;jump if not greater | ZF != OF 或 ZF=1 | if (si <= sj); |
JNLE/JG | 若不小于等于则跳转;若大于则跳转 | jump if not less equal;jump if greater | SF=0F 且 ZF=0 | if(si>sj) |
目前就学了这么多
(○` 3′○)