1. JMP指令:唯一作用是无条件修改EIP的值,没有对栈和寄存器产生影响。
JMP 寄存器/立即数
本质是MOV EIP,寄存器/立即数,EIP只能由JMP指令修改
2. CALL指令:
第一个作用和JMP一样,MOV EIP,寄存器/立即数。
第二个作用,把CALL指令的写一个指令地址push到栈顶(修改ESP)
CALL指令还没执行,怎么知道下一行指令的地址?
根据CALL指令占用的数据宽度,加偏移量去算,比如CALL这条指令,地址0X004183D7中数据为E8 21 00 00 00,有5个字节,下一行指令的地址就是地址偏移5
3.RET
本质是POP EIP
RET指令通常和CALL成对出现,把CALL压栈的地址POP EIP,让程序回归原来的流程
4. CMP指令:该指令是比较两个操作数是否相同
指令格式:CMP R/M,R/M/IMM
相当于SUB指令,但是只会用两个数相减来比较是否相同,相减的结果并不保存在第一个操作数中。
只会根据相减的结果来改变标志位的,当两个操作数相等的时候,零标志位置为1.
MOV EAX,100
MOV ECX,100
CMP EAX,ECX //只相减比较,判断并修改零标志寄存器,不会把EAX修改为相减结果。
CMP AX,WORD PTR DS:[405000]
CMP AL,BYTE PTR DS:[405000]
CMP EAX,DWORD PTR DS:[405000]
4. 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,如果EAX的二进制某些位为 1 的话,那么运算的结果就不为零。
TEST EAX,EAX
5.
1. JE,JZ -------jump if equal结果为零则跳转(相等时跳转)-------ZF = 1
例:
CMP EAX,ECX
JZ 0x413f9
1、 JE, JZ -------------结果为零则跳转(相等时跳转)----------------ZF=1
2、 JNE, JNZ -------------结果不为零则跳转(不相等时跳转)----------------ZF=0
3、 JS -------------结果为负则跳转----------------SF=1
4、 JNS -------------结果为非负则跳转----------------SF=0
5、 JP, JPE -------------结果中1的个数为偶数则跳转----------------PF=1
6、 JNP, JPO -------------结果中1的个数为偶数则跳转----------------PF=0
7、 JO -------------结果溢出了则跳转----------------OF=1
8、 JNO -------------结果没有溢出则跳转----------------OF=0
9、 JB, JNAE-------------小于则跳转 (无符号数)----------------CF=1
10、 JNB, JAE-------------大于等于则跳转 (无符号数)----------------CF=0
11、 JBE, JNA-------------小于等于则跳转 (无符号数)----------------CF=1 or ZF=1
12、 JNBE, JA-------------大于则跳转(无符号数)----------------CF=0 and ZF=0
13、 JL, JNGE-------------小于则跳转 (有符号数)----------------SF≠ OF
14、 JNL, JGE-------------大于等于则跳转 (有符号数)----------------SF=OF
15、 JLE, JNG-------------小于等于则跳转 (有符号数)----------------ZF=1 or SF≠ OF
16、 JNLE, JG-------------大于则跳转(有符号数)----------------ZF=0 and SF=OF