汇编语言:比较指令、跳转指令、JCC的使用
一、JMP指令:修改EIP当前运行的下一条指令
JMP寄存器/立即数
目标类似: mov EIP,寄存器/立即数
CALL指令: 调用函数 CALL地址A/寄存器
等价:
PUSH地址B ;保存call的下一条指令地址,压栈,作为返回值,
MOVEIP,地址A/寄存器 ;将函数首地址作为EIP
RET指令:
等价:LEAESP,[ESP+4] ;esp=esp+4
MOVEIP,[ESP-4] ;和CALL相反,将CALL指令的下一条指令地址赋值给EIP;
二、比较指令
CMP R/M,R/M/IMM
该指令是比较两个操作数,实际上,它相当于SUB指令,但是相减的结果并不保存到第一个操作数中。只是根据相减的结果来改变零标志位的,当两个操作数相等的时候,零标志位置1。
TEST指令:指令格式:TEST R/M,R/M/IMM
该指令在一定程序上和CMP指令是类似的(类似and),两个数值进行与操作,结果不保存,但是会改变相应标志位.
常见用法:用这个指令,可以确定某寄存器是否等于0。(观察ZF)
三、JCC指令 16种跳转
比较指令之后,一般都会有分支判断。
根据标志位进行判断,下一步的分支。
JE,JZ
结果为零则跳转(相等时跳转)
ZF=1
JNE,JNZ
结果不为零则跳转(不相等时跳转)
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=1orZF=1
JNBE,JA
大于则跳转(无符号数)
CF=0andZF=0
JL,JNGE
小于则跳转(有符号数)
SF≠OF
JNL,JGE
大于等于则跳转(有符号数)
SF=OF
JLE,JNG
小于等于则跳转(有符号数)
ZF=1orSF≠OF
JNLE,JG
大于则跳转(有符号数)
ZF=0andSF=OF
四、思考
1、CALL执行时堆栈有什么变化?EIP有变化吗?
Call执行时,保存了cal函数首地址到EIP,同时将Call函数的首地址压栈;
2、RET执行时堆栈有什么变化?EIP有变化吗?
和Call的过程相反,将前面Call的下一条指令地址,从堆栈中取出来作为EIP。
3、使用汇编指令修改标志寄存器中的某个位的值,实现JCC的十六种跳转.
不允许在OD中通过双击的形式修改标志寄存器.
要通过汇编指令的执行去影响标志位,能用CMP和TEST实现的优先考虑.
见上面的表格;
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。