菜鸟最近才刚刚开始学习逆向,做了一些汇编的笔记,如下:

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′○)

版权声明:本文为lingtian原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/lingtian/p/13799929.html