zoukankan      html  css  js  c++  java
  • 汇编:jmp系列跳转指令总结

    助记方法:

    J:跳转
    C: 进位位置位
    N: 否
    S: 符号位置位
    o: 溢出位置位
    Z: 零标志位置位
    E: 等于
    P:奇偶位置位
    A: Above
    B: Below
    L: Less (Little的比较级)
    G: Greater (Great的比较级)

    (SF^OF)=1 --> SF=0, OF=1 --> a < b
    SF=1, OF=0 --> a < b

    (SF^OF)=0 --> SF=1, OF=1 --> a > b
    SF=0, OF=0--> a >= b


    条件跳转指令是根据标志寄存器中的相关标志位的值来进行跳转的,因此,条件跳转指令只能与那些能够影响标志寄存器的相关标志位的指令配合使用;
    能够直接影响标志寄存器的相关标志位的指令有:
    1、算术运算指令 : add、sub、adc、sbb、inc、dec、neg、mul、div、imul、idiv,等等;
    2、按位逻辑运算 : and、or、xor、not,等等;
    3、比较运算指令 : cmp、test;
    4、移位操作指令 : shr、shl、sar、sal、ror、rol、rcr、rcl;
    5、BCD数调整指令: aaa、aas、daa、das、aam、aad;
    6、标志处理指令 : clc、stc、cmc、cld、std、cli、sti;

    能够间接影响标志寄存器的相关标志位的指令序列有:
    pushf --> pop eax --> modify eax --> push eax --> popf
    即:
    pushf
    pop eax
    modify eax
    push eax
    popf
    jbe OPR
    这样的一系列操作之后,条件转移指令"jbe OPR"也可以根据标志寄存器的相关标志位进行转移;

    测试:
    jmp 无条件跳转


    无符号
    Je 等于跳转
    Jne 不等于跳转
    Ja = jnbe 大于跳转 = JNBE(不小于或等于跳转)
    Jb= jnae 小于跳转 = JNAE(不大于或等于跳转)
    Jna 不大于跳转 = JBE(小于或等于跳转)
    Jnb 不小于跳转 = JAE(大于或等于跳转)

    Js 为负跳转
    Jz 为0跳转
    Jc 进位跳转
    Jo 溢出跳转
    Jp 奇偶位置位 跳转


    有符号
    Jg 有符号大于 跳转 = JNLE
    Jge 有符号大于等于 跳转 = JNL
    Jl 有符号小于 跳转 = JNGE
    Jle 有符号小于等于 跳转 = JNG

    X86下   直接的jmp分3种 
    Short Jump(短跳转)机器码 EB rel8 
    只能跳转到256字节的范围内 
    Near Jump(近跳转)机器码 E9 rel16/32 
    可跳至同一个段的范围内的地址 
    Far Jump(远跳转)机器码EA ptr 16:16/32 
    可跳至任意地址,使用48位/32位全指针 

    测试用例:

    .386
    .model  flat,c
    .DATA
    Temp db "hello",0
    
    .CODE
    
    ;jmp 无条件跳转
    Sub_1 PROC  
            push ebp
            mov  ebp,esp
            sub  esp,40h
            mov  eax,dword ptr[ebp+8h]
           ; jmp  @F
            push 0
            push offset Temp
            push offset Temp
            push 0
            call eax
    @@:     mov eax,2
     
            add esp,40h
            pop ebp
            RET
    Sub_1 ENDP

    .386
    .model  flat,c
    .DATA
    Temp db "hello",0
    
    .CODE
    
    ;jmp 无条件跳转
    Sub_1 PROC  
            push ebp
            mov  ebp,esp
            sub  esp,40h
            mov  eax,dword ptr[ebp+8h]
            jmp  @F
            push 0
            push offset Temp
            push offset Temp
            push 0
            call eax
    @@:     mov eax,2
     
            add esp,40h
            pop ebp
            RET
    Sub_1 ENDP

     

    win10  vs2015  .asm 文件测试

  • 相关阅读:
    【QQ空间转移】C/C++函数的调用约定
    【QQ空间转移】BIG Endian 和 Little Endian模式
    【QQ空间转移】友元函数
    【QQ空间转移】和室友争论所瞎想的
    【QQ空间转移】银行同业拆借
    【QQ空间转移】票据和债券
    js实现给数字加三位一逗号间隔的两种方法
    js获取上个月第一天
    获取所选月份指定时间范围
    PLSQL 11 注册码
  • 原文地址:https://www.cnblogs.com/HsinTsao/p/6512715.html
Copyright © 2011-2022 走看看