美文网首页
汇编: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

    1. jmp 和 jmpq 汇编代码指令有一个字符的后缀,表明操作数的大小,如图: 2. call和jmp cal...

  • 汇编偏移

    Call指令主要实现对一个函数的调用。Jmp指令主要实现地址的调转。 Call指令和Jmp指令的区别1:Call指...

  • 9.汇编-JCC

    9.汇编-JCC 之前可以修改EIP寄存器的指令JMP,CALL,RETN 所有JCC指令的动作->根据标志寄存器...

  • 修改EIP

    JMP指令:修改EIP的值 CALL指令 RET指令:

  • 第三编:汇编基础 jmp,call和cmp指令

    Flags flag就像寄存器,除了每个只保持1位,不是1(true)就是0(false)。每个标志是一个大寄存器...

  • 16位汇编简记

    汇编: 汇编即是机器指令助记符,机器指令让cpu工作。像是mov、jmp、jcxz等汇编指令都有对应的机器指令。有...

  • 6.汇编-修改EIP的指令

    6.汇编-修改EIP的指令 EIP寄存器 EIP寄存器表示CPU下次执行的位置 JMP指令 JMP指令相当于给EI...

  • 【汇编】JMP 字节码

    做些记录:

  • 汇编- call和ret

    尽管这两条指令看起来很简单,但是很多初学者并不能完全领会这两条指令的本质。所以我把它们作为一个单独的章节来介绍,我...

  • 7.汇编-汇编中的函数

    7.汇编-汇编中的函数 什么是函数 函数就是一系列指令的几个,为了完成某个会重复使用的特定功能 函数调用 用JMP...

网友评论

      本文标题:汇编:call和jmp

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