汇编:call和jmp
1. jmp 和 jmpq
汇编代码指令有一个字符的后缀,表明操作数的大小,如图:
2. call和jmp
call 一般用于调用子程序,ret 返回到 call 的下一行;
jmp 一般用于程序控制,jmp 之后的指令如果跟了 ret,那就直接退出到上一个 call 对应指令的下一行;
3. 举例
main 函数下调用。
情况一:
// foo
mov edi,1000
call myfunction
add eax,7
retmyfunction:
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!
retmyfunction:
mov eax,edi ; copy our first parameter into eax (to be returned)
ret ; go back to main
总结:
- call 应该是有个寄存器之类的地方保留了上次之前命令的位置,而 jmp 没有。
- call 影响代码执行流程,而 jmp 不影响,即 jmp 本身就是流程中的一部分。所以上诉例子,jmp未影响代码执行流程,ret 才会直接从 foo 退出到 main 函数;
4. 桩函数的例子
桩函数的调用:
打个断点:
(lldb) breakpoint set -a 0x7fff201932ac
Breakpoint 7: where = libobjc.A.dylib`symbol stub for: issetugid, address = 0x00007fff201932ac
进入到桩函数:
这里调用桩函数使用的是 call,而桩函数内部,取出了 __la_symbol_ptr / __got 中指针存储的值之后,使用的是 jmp 进行跳转。因此,再遇到下一个 ret 时,会直接返回到 call 的下一行;
如果 call 换成 jmp 就乱了~~~
即:
- call 用来调用子程序,如函数。jmp 用来执行指令的跳转;
http://www.taodudu.cc/news/show-1912766.html
相关文章:
- code review的一些思考
- iOS:fishhook原理分析
- mach-O文件结构分析
- 设备唯一标志的解决方案
- iOS:主流启动优化方案浅析
- iOS:segment对齐原则
- HTTP缓存机制及其在iOS中的应用
- iOS:SideTable
- iOS:isa指针
- iOS底层:PAGEZERO的作用
- iOS图形学(三):屏幕成像原理
- iOS图形学(四):iOS中的绘图框架
- Java基础(一):简介和基础数据类型
- Java基础(二):面向对象
- Java:常量池
- Java基础(三):常用对象
- Java基础(四):异常处理
- Java基础(五):多线程
- Android:权限处理
- AsyncTask的基本使用
- 在Nginx中配置SSL证书
- Base64编码流程
- Nginx配置基础认证
- Cookie、Session、Token、RefreshToken
- JSCore浅析及其在iOS上的使用
- 编程语言的动态性(Dart和OC对比)
- iOS:Universal Link
- AFN中的鉴权
- openGL ES 教程(二):渲染管线
- MySQL(2)----DDL语句之增、删、改、查操作
汇编:call和jmp相关推荐
- 基于8086CPU微处理器的汇编学习之JMP指令
JMP指令: 更改CS:IP寄存器的内容,以让CPU从新指定的内存地址开始继续执行指令. 格式: JMP 段地址:偏移地址 ------------------------------------- ...
- 汇编中的jmp转移指令:jmp short、jmp near ptr、jmp far ptr
从8086CPU的定义上来讲,只要是可以修改IP(指令指针寄存器),或同时修改CS(代码段寄存器)和IP(指令指针寄存器)的指令统称为转移指令.也就是说,转移指令是用来控制CPU指向内存中某处代码的指 ...
- jmp指令对应的机器码
od随便打开一个记事本,汇编几条jmp指令,可以看到如下 地址 HEX 反汇编 010073B4 - E9 7B9E8787 JMP 8 ...
- mrctf2020_shellcode_revenge(不用仔细分析汇编)
日常拖进IDA一看,发现不能反编译,原因是0x124D位置有个call rax 然后看了一下汇编,发现又臭又长,由于本人还没有学汇编,各种jmp,cmp等等看得我头皮发麻 所以我干脆直接在IDA里面改 ...
- 单片机复位后为什么要对sp重新赋值_常见的单片机复位方式及其原理分析
为确保设计出的电路系统稳定可靠的工作,必须在电路中加入复位电路--将电路恢复到初始状态.类似于我们使用的电脑,一旦我们电脑死机或发生其他问题,我们会利用重启按钮重启我们的电脑.复位电路亦是如此,一旦我 ...
- stm32如何执行软复位_常见的单片机复位方式及其原理分析
为确保设计出的电路系统稳定可靠的工作,必须在电路中加入复位电路--将电路恢复到初始状态.类似于我们使用的电脑,一旦我们电脑死机或发生其他问题,我们会利用重启按钮重启我们的电脑.复位电路亦是如此,一旦我 ...
- 《软件加密与解密》第三版学习日志一
一 动态分析技术 动态分析技术中最重要的工具是调试器,分为用户模式和内核模式两种类型.用户模式调试器是指用来调试用户模式应用程序的调试器,他们工作在Ring 3级,如OllyDbg.Visual C+ ...
- 深入理解计算机操作系统:第2章 信息的表示和处理(学习笔记)
现代计算机存储和处理的信息都是用二进制表示的,即0和1. 用多个二进制比特位的不同组合和不同解释能够表示数量有限的元素,比如用32位比特的组合则有2^32种可能,因此它能表示从0开始到42949672 ...
- 汇编语言练习_1_数字分解_显示
文章目录 环境 1.Bochs虚拟机 2.VirtualBox 工具 1.notepad++ 2.nasm 思路 第一步: 第二步: 第三步: 第四步: 第五步: 第六步: 第七步: 解析 1.第二行 ...
- 条件控制与条件传送详解
条件控制与条件传送详解 提要 CSAPP3e中文译本 3.6.5 用条件控制来实现条件分支 3.6.6 用条件传送来实现条件分支 CSAPP3e第三章前面主要是介绍了机器级代码的二进制形式和汇编形式. ...
最新文章
- 【FFmpeg】ffmpeg工具源码分析(一):main函数
- java selector 源码_基于selector的源码分析和理解、思想和应用实践
- 在linux下使用ZThread
- 大数据时代第一部分思维导图_大数据时代总结思维导图模板分享
- pythondict(zip())_python基础:zip和dict详解
- docker piwik
- inet_pton, inet_ntop
- Java中高效判断数组中是否包含某个元素
- 剑指Offer之左旋字符串
- Beanutils的使用
- JavaScript---radio组
- ajax 的post方法用例(带循环)
- 29.变量的生命周期
- Oracle ORA-03113错误解决办法
- ASP.NET(C#版) FileUpload控件
- Ingenuous Cubrency——完全背包
- 【星辰傀儡线·命运环·卷一 血鸦】 8 伏击影袭
- 【失业的程序员】选修计算机专业的伤与痛.....
- 面试中面试官问的一些问题总结
- 数学模型参考文献的格式