汇编语言:比较指令、跳转指令、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     大于等于则跳转 (无符号数)     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实现的优先考虑.
     见上面的表格; 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值