当前位置 主页 > 网站技术 > 代码类 >

    汇编语言:比较指令、跳转指令、JCC的使用

    栏目:代码类 时间:2020-01-24 09:04

    一、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