汇编语⾔:⽐较指令、跳转指令、JCC
⼀、JMP 指令:修改EIP 当前运⾏的下⼀条指令
JMP 寄存器/⽴即数
⽬标类似: mov EIP,寄存器/⽴即数
CALL指令: 调⽤函数 CALL 地址A/寄存器
等价:
PUSH 地址B ;保存call的下⼀条指令地址,压栈,作为返回值,
MOV EIP,地址A/寄存器 ; 将函数⾸地址作为EIP
RET指令:
等价:LEA ESP,[ESP+4] ; esp = esp + 4
MOV EIP,[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 ⼤于等
于则跳
转 (⽆符比较指令cmp怎么用
号数)
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
四、思考
1、CALL执⾏时堆栈有什么变化?EIP有变化吗?
Call执⾏时,保存了cal函数⾸地址到EIP,同时将Call函数的⾸地址压栈; 2、RET执⾏时堆栈有什么变化?EIP有变化吗?
和Call的过程相反,将前⾯Call的下⼀条指令地址,从堆栈中取出来作为EIP。
3、使⽤汇编指令修改标志寄存器中的某个位的值,实现JCC的⼗六种跳转.
不允许在OD中通过双击的形式修改标志寄存器.
要通过汇编指令的执⾏去影响标志位,能⽤CMP和TEST实现的优先考虑.
见上⾯的表格;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论