美文网首页
汇编:call和jmp

汇编:call和jmp

作者: 康小曹 | 来源:发表于2021-05-18 10:22 被阅读0次

    1. jmp 和 jmpq

    汇编代码指令有一个字符的后缀,表明操作数的大小,如图:

    image.png

    2. call和jmp

    call 一般用于调用子程序,ret 返回到 call 的下一行;

    jmp 一般用于程序控制,jmp 之后的指令如果跟了 ret,那就直接退出到上一个 call 对应指令的下一行;

    3. 举例

    main 函数下调用。

    情况一:

    // foo
    mov edi,1000
    call myfunction
    add eax,7
    ret
    
    myfunction:
    mov eax,edi  ; copy our first parameter into eax (to be returned)
    ret  ; go back to foo
    

    情况二:

    mov edi,1000
    jmp myfunction
    add eax,7 ; <- never executed!
    ret
    
    myfunction:
    mov eax,edi  ; copy our first parameter into eax (to be returned)
    ret  ; go back to main
    

    总结:

    1. call 应该是有个寄存器之类的地方保留了上次之前命令的位置,而 jmp 没有。
    2. call 影响代码执行流程,而 jmp 不影响,即 jmp 本身就是流程中的一部分。所以上诉例子,jmp未影响代码执行流程,ret 才会直接从 foo 退出到 main 函数;

    4. 桩函数的例子

    桩函数的调用:

    image.png

    打个断点:

    (lldb) breakpoint set -a 0x7fff201932ac
    Breakpoint 7: where = libobjc.A.dylib`symbol stub for: issetugid, address = 0x00007fff201932ac
    

    进入到桩函数:

    image.png

    这里调用桩函数使用的是 call,而桩函数内部,取出了 __la_symbol_ptr / __got 中指针存储的值之后,使用的是 jmp 进行跳转。因此,再遇到下一个 ret 时,会直接返回到 call 的下一行;

    如果 call 换成 jmp 就乱了~~~

    即:

    • call 用来调用子程序,如函数。jmp 用来执行指令的跳转;

    相关文章

      网友评论

          本文标题:汇编:call和jmp

          本文链接:https://www.haomeiwen.com/subject/gleejltx.html