天天看点

汇编指令学习与总结CMP,TEST,JE,JNZ,JNE,LEA,MOVE,SUB,INC,DEC,ADD,MUL,DIV,JGE,JB ,CQD

所有的汇编都是我零基础逆向微信汇编的指令 边玩边学(左边有 机器码,自己可以查 位置)

如有不对的地方请指出

注明:一些指令的英文单词,并非官方,只是为了好记好理解

注意:无符号数的比较用高于和低于,有符号数的比较用大于小于

1.cmp【compare】指令

进行比较两个操作数的大小

例:cmp oprd1,oprd2  // 执行oprd1-oprd2  操作,不过不保存结果,只影响标志位。
           

为第一个操作减去第二个操作数,但不影响第两个操作数的值,它影响flag的CF,ZF,OF,AF,PF.

如果减数大于被减数,此时有借位。则将cf位置1,否则置0.

2.test与JE【jump When Equal】指令

test 指令用于两个操作数的按位AND运算,并根据结果设置标志寄存器,结果本身不会写回到目的操作数。

通俗点来说 .test非常普遍的用法是用来测试寄存器是否为空: 寄存器为空, 则ZF零标志为1,则跳转

JE 当ZF标志位为零,就跳转

66E9419A    85DB            test ebx,ebx
66E9419C    74 64           je short WeChatWi.66E94202 //这两句含义为:ebx寄存器为空,就跳转
           

3.JNZ【jump no Zero】与JNE【jump no Equals】

都依据ZF标志位(我经常叫做 零标志位,判断是不是0) 不为0/不等于时跳转执行

通俗来说: 这两条指令完全没区别! 它们对应于完全相同的机器代码,含义为ZF标志位不等于0 则执行

66E6F4C8    66:8338 00      cmp word ptr ds:[eax],0x0
66E6F4CC    75 05           jnz short WeChatWi.66E6F4D3 //这两句含义为eax寄存器不等于0则跳转
           

4.LEA【load(加载) Effective(有效) Address(地址) 传送的是值 **

格式: LEA 操作数A, 操作数B

功能: 将操作数B的有效地址传送到指定的的某个寄存器,操作数A必须是寄存器

LEA AX,[SI],作用是将寄存器SI的内容4567H当做数据**传送给AX;

自我感觉来说:用来提升堆栈或者来获取某个值所对应的内存地址(有异议请评论区哈)

66E6F4B0    8D45 E0         lea eax,dword ptr ss:[ebp-0x20]
//这句的意思时 将ebp寄存器的地址减去0X20 的 内存地址的值,赋值给eax寄存器
           

5.MOV【move 】 传送的是地址

MOV指令是数据传送指令,用于将一个数据从源地址传送到目标地址(移动/赋值)

MOV AX,[SI],作用是将寄存器SI的内容4567H当做地址看待,将地址为4567H处的内容传送给AX;

66E6F94F    8941 08         mov dword ptr ds:[ecx+0x8],eax //将Eax寄存器的值  赋值给  ecx+0x8这个内存地址 指向的值
66E6F952    8BCE            mov ecx,esi//将esi寄存器的32位数据传送到ecx寄存器 

           

6.ADD(加),SUB(减),MUL(乘),DIV(除) 原理一样

ADD ax,9 含义为 ax = ax+9
sub ax,9   含义为: ax = 9-ax
sub ax,bx 含义为:  ax = bx - ax 
           

imul 有符号乘法

mul 无符号乘法

举例

mov ebx,3 //将3送入到 ebx寄存器
imul ebx // 只有一个源时,默认是 ebx 乘与 eax 
           

7.inc【increase 1 】,dec【decrease 1】

自增1,自减1

inc a 相当于 add a,1 //i++
优点 速度比sub指令快,占用空间小
dec a 相当于 sub a,1 
优点 速度比sub指令快,占用空间小
           

8.jge【jump when greater or equal】大于或者等于

两个标志位sf和of 转移条件sf异或of=0

0040B780   cmp         dword ptr [ebp-24h],1Eh     
0040B784   jge         main+40h (0040b790)  //这两句的含义为 ebp-24H 大于等于1EH就执行跳转
           

9.JB(jump not above and equal )低于,即不高于且不等于则转移

//假设 edx =A  eax = 0, 跳转实现
00401354   .  3955 F0       cmp eax,edx
00401357      72 07         jb short 硬编码寻.00401360
           

但执行这条语句之前先用CMP来比较2个无符号数,CMP比较无符号数后影响的是CF,所以JB应该是通过CF来判断的

(注意:无符号数的比较在这里用高于和低于,有符号数的比较在这里用大于小于)

10 CQD

二进制数的 最高位是0 代表正数 1代表负数

cqd 如下方图那样: 当eax 最高位是 0时, edx = 0000 0000,

当eax 最高位是 0时, edx = FFFF FFFF,

CDQ 这个指令把 EAX 的第 31 bit 复制到 EDX 的每一个 bit 上。 它大多出现在除法运算之前。它实际的作用只是把EDX的所有位都设成EAX最高位的值。也就是说,当EAX <80000000, EDX 为00000000;当EAX >= 80000000, EDX 则为FFFFFFFF。

当eax 是正数时:

汇编指令学习与总结CMP,TEST,JE,JNZ,JNE,LEA,MOVE,SUB,INC,DEC,ADD,MUL,DIV,JGE,JB ,CQD

当eax 是负数时:

汇编指令学习与总结CMP,TEST,JE,JNZ,JNE,LEA,MOVE,SUB,INC,DEC,ADD,MUL,DIV,JGE,JB ,CQD

汇编指令的全拼 有很多,放到了doc中,附连接

链接: https://pan.baidu.com/s/17ngnluFDW_cSJOnqACE2sg 提取码: m2cc 复制这段内容后打开百度网盘手机App,操作更方便哦

继续阅读