JCC学习
EIP存储的是指令地址
不能使用mov来修改EIP的值
使用jmp short(如果不超过128个字节就会加short)
jmp的作用是修改EIP(无条件修改)
jmp 寄存器/立即数
call指令:
修改EIP
push 返回地址(即call命令下一行指令的地址)(当前指令加当前指令的长度)
ret指令(ret指令和call指令是成对出现的)返回上一个call的下一个指令
pop eip=ret
cmp指令:(比较两个值)
cmp eax,ecx(其实是eax-ecx然后只改变标志寄存器)
当eax=ecx时zf为1
当sf=1时说明eax<ecx
cmp还可以使内存和寄存器比较(宽度要一样)
test指令:
在一定程度上和cmp指令类似,两个数值进行与操作,结果不保存,但是会改变响应标志位
常见用法:用这个指令,可以确定某寄存器是否等于0
test EAX,EAX 观察ZF位
如果EAX的二进制位中任意是1那么运算结果不为0
只看标志寄存器:
JE/JZ
|
结果为0则跳转(相等时跳转)
|
ZF=1
|
if(i==j);if(i==0)
|
JNE/JNZ
|
结果不为0则跳转(不相等时跳转)
|
ZF=0
|
if(i!=j);if(i!=0)
|
JS
|
结果为负则跳转
|
sf=1
|
if(i<0)
|
jns
|
结果不为负则跳
|
sf=0
|
if(i>0)
|
jp/jpe
|
结果中1的个数为偶则跳
|
PF=1
|
null
|
jnp/jpo
|
结果中1的个数为奇数则跳
|
PF=0
|
null
|
JO
|
若溢出则跳
|
OF=1
|
null
|
JNO
|
若无溢出则跳
|
OF=0
|
null
|
jcc是有选择的Jmp