注明:一些指令的英文单词,并非官方,只是为了好记好理解
注意:无符号数的比较用高于和低于,有符号数的比较用大于小于
1.cmp【compare】指令
进行比较两个操作数的大小
例:cmp oprd1,oprd2 // 执行oprd1-oprd2 操作,不过不保存结果,只影响标志位。
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
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, 跳转实现 00 . 3955 F0 cmp eax,edx 00 72 07 jb short 硬编码寻.00
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/229804.html原文链接:https://javaforall.net
