滴水逆向三期JCC
CMP指令:
指令格式:CMP R/M,R/M/IMM 不能同时为内存
CMP指令是用来比较两个值的
可以看到EAX的值变成了0 结果都是0的话ZF变成了0
我们可以看到CMP的时候,EAX的值没有变而SUB的时候EAX值变了,再看就会发现CMP的时候只改变标志寄存器的值,以后决定程序怎么走的时候,经常会涉及到比较两个数,最简单的方法就是减一下,可是你还不能把原来的数去掉,这个时候我们就会用到CMP的指令,一般的时候用于比较两个数是不是想等的,这个时候就看Z位
我们把ECX改成200 两个寄存器里面的值不一样,发现S位变了,S位改了说明第一个数一定比第二个数小
只要宽度一样,就可以用寄存器和内存进行比较
CMP这个指令,相当于减法,但是它只改变标志寄存器
TEST指令:
指令格式:TEST R/M,R/M/IMM
该指令在一定程序上和CMP指令时类似的,两个数值进行与操作,结果不保存,但是会改变相应标志位
与的操作表项如下:
1 and 1 = 1
1 and 0 = 0
0 and 1 = 0
0 and 0 = 0
常见用法:用这个指令,可以确定某寄存器是否等于0
TEST EAX,EAX 可以看出来某一个寄存器的值是不是空的
EAX里面如果里面有任何一个位,如果不等于0的话,与后一定会有不等于0的,什么情况自己和自己与完了是0,自己本身都是0的才是0
JCC的本质跟标志寄存器缺一不可的
JCC这里死记硬背(就是一个有选择的JUMP)
- JE,JZ(jump if equal)结果为零则跳转(相等时候跳转) ZF=1
- JNE,JNZ(jump not equal) 结果不为零的时候跳转(不想等的时候跳转) ZF=0
- JS 结果为负则跳转 SF=1
- JNS 结果为非负则跳转 SF=0
- JP,JPE 结果中1的个数为偶数则跳转 PF=1
- JNP,JPO 结果中1的个数为偶数则跳转 PF=0
- JO 结果溢出了则跳转 OF=1
- JNO 结果没有溢出则跳转 OF=0
- JB,JNAE 小于则跳转(无符号数) CF=1
- JNB,JAE 大于则跳转(无符号数)CF=0
- JBE,JNA 小于等于则跳转(无符号数) CF=1 or ZF=1
- JNBE,JA 大于则跳转(无符号数)CF=0 and ZF=0
- JL,JNGE 小于则跳转(有符号数) SF不等于OF
- JNL,JGE 大于等于则跳转(有符号数) SF=OF
- JLE,JNG 小于等于则跳转(有符号数) ZF=1 or SF不等于OF
- JNLE,JG 大于则跳转(有符号数)ZF=0 and SF=OF