首页
学习
活动
专区
圈层
工具
发布

ret指令与call指令的深入理解

,有两个比较关键的地方:call和 ret。...在《汇编语言(第3版)》中对这两个指令的概述为: call和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP。它们经常被共同用来实现子程序的设计,也即是调用和返回。...其中ret指令用栈中的数据,修改IP的内容,实现近转移。而call指令将IP或者CS和IP压入栈中,实现转移。还有retf指令,用栈中的数据,修改CS和IP的内容,实现远转移。...ret指令与call指令实现了什么功能? 1、ret指令用栈中的数据,修改IP的内容,返回代码段的第一条指令。相当于 pop IP 2、call指令将IP或者CS和IP压入栈中,实现转移。...当子程序执行完后,由于call指令后面的指令的地址已经存储在栈中( push操作), 使得在子程序后面再使用ret指令时候,栈中的数据会设置IP内的值, IP内的值的设置实现了CPU继续执行call指令后面的代码指令

5K20

汇编语言中的call指令和ret指令

call指令是调用函数的意思,让处理器从新的内存地址开始执行,过程使用RET来返回,让处理器回到调用点上。 call会将返回地址压入堆栈,然后再将要被调用的地址复制到IP寄存器里。...当RET指令被执行的时候,就会从堆栈中弹出返回地址到IP寄存器内。 调用和返回示例 假设在 main 过程中,CALL 指令位于偏移量为 0000 0020 处。...通常,这条指令需要 5 个字节的机器码,因此,下一条语句(本例中为一条 MOV 指令)就位于偏移量为 0000 0025 处: main PROC 00000020 call MySub 00000025...ret MySub ENDP 当 CALL 指令执行时如下图所示,调用之后的地址(0000 0025)被压入堆栈,MySub 的地址加载到 EIP。...执行 MySub 中的全部指令直到 RET 指令。当执行 RET 指令时,ESP 指向的堆栈数值被弹岀到 EIP(如下图所示,步骤 1)。

1.5K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【汇编语言】call 和 ret 指令(一) —— 探讨汇编中的ret和retf指令以及call指令及其多种转移方式

    call 和ret 指令都是转移指令,它们都修改IP,或同时修改CS和IP。它们经常被共同用来实现子程序的设计。这一章,我们讲解call和ret指令的原理。...1. ret 和 retf 1.1 ret 指令 1.1.1 功能与理解 ret指令用栈中的数据,修改IP的内容,从而实现近转移。...CPU执行ret指令时,进行下面两步操作: (1)(IP)=((ss)*16+(sp)) (2)(sp)=(sp)+2 如果我们用汇编语法来解释ret指令,则: CPU执行ret指令时,相当于进行:...pop IP 1.1.2 程序演示 下面的程序中,ret 指令执行后,(IP)=0,CS:IP指向代码段的第一条指令。...指令 call指令经常跟ret指令配合使用,因此CPU执行call指令,进行两步操作: (1)将当前的 IP 或 CS和IP 压入栈中 (2)转移 call 指令不能实现短转移,除此之外,call指令实现转移的方法和

    72210

    【汇编语言】call 和 ret 指令(三) —— 深度解析汇编语言中的批量数据传递与寄存器冲突

    如果有两个参数,那么可以用两个寄存器来放,可是如果需要传递的数据有3个、4个或更多直至 N个,我们怎样存放呢? 寄存器的数量终究有限,我们不可能简单地用寄存器来存放多个需要传递的数据。...因为子程序中要用到循环,我们可以用loop指令,而循环的次数恰恰就是字符串的长度。 出于方便的考虑,可以将字符串的长度放到cx。...ret 1.3.2 程序实现 编程:将data段中的字符串转化为大写。...mov cx,12 ;cx存放字符串的长度 call capital mov ax,4c00h int 21h capital:and...;ds:si 指向下一个单元 jmp short capital ok:ret 2.3 子程序的应用 来看一下这个子程序的应用。

    14310

    x86_64 的 CALL 指令长度会发生变化吗?

    最近和群友讨论指令集时,遇到一个有意思的问题,x86_64 的 CALL 指令长度会发生变化吗?...今天我们通过一个简单的例子验证一下长度会发生变化 call 指令简介 CALL[1] 指令调用一个过程,指挥处理器从新的内存地址开始执行。...过程使用 RET(从过程返回)指令将处理器转回到该过程被调用的程序点上。 根据源码的不同,会两种不同开头和长度的指令[2]: e8 和 ff ?...image 经过编译后,会转为两种不同写法的 call 指令: 为了方便对照,采用 clang -O3 进行编译 第一个跳转命令被拆分到 3 个指令,其中 call 指令是 ff 和 d1 ,代表跳转到...该行指令的地址是0x40111a ,下一个指令的地址是 0x40111f 两个地址相减:0x40113e - 0x40111f = 0x1f所以,偏移量是 0x1f 参考资料 [1] CALL: http

    1.1K60

    为什么现代单片机的串口数量越来越多?

    集成多个串口的MCU使得系统能够兼容多种设备,支持并行数据采集和独立任务处理。 随着物联网的普及以及嵌入式系统复杂性的提升,多个串口的存在让设计更加简化并提升了系统的灵活性和可靠性。...随着MCU工艺的进步,集成多个串口的成本也逐渐下降,且可以通过引脚复用功能(Pin Multiplexing)减少外部接口的空间。...串口具有较强的实时性,不像 USB 或以太网需要复杂的协议栈支持,便于轻量、实时的数据通信需求。 3、兼容性与通用性 串口是嵌入式系统工程师普遍掌握的基本接口,软硬件支持广泛且通用性强。...许多旧设备或外设仍然采用串口通信,为了兼容这些设备和标准,MCU 厂商继续增加串口数量,以支持多设备的并行连接。...此外,串口不需要连续的时钟同步,因此在休眠和唤醒控制上具有优势。 异步传输也避免了复杂的同步控制机制,便于资源受限的嵌入式设备。

    18200

    IC行业毕业生人均offer多,企业发出的offer数量远大于其需求

    这和我以前的文章的观点是一致的,着实让我感到欣慰。薪水的高低,其实很容易比较,如果认为薪水最重要的话,也就不会有offer怎么选的问题了。...集成电路相关专业毕业生的人均offer数量,意味着人才供给与需求之间的巨大差距。 人才需求量大不假,但是我的观点是,offer的供给量其实远远大于人才的需求量。...也就是说,企业其实发出了远大于自身需求量的offer。有些企业,即便只是招收10个人,很有可能他们已经发出了100个offer,甚至更多。这是今年人均offer数量大增的根本原因。...这些企业为什么要发这么多的offer? 学生和公司其实是市场中的供需双方。作为学生,希望自己有更多的选择。因此,会希望拿更多的offer。从企业角度呢?...但是如果手里的offer太多,甚至超过10个,我认为你可能还不清楚自己的目标是什么。这即使对自己的时间的浪费,也是对别人的时间,社会资源的浪费。

    38720

    16汇编第十讲完结Call变为函数以及指令的最后讲解

    ) 首先我们明白一点,昨天我们写的只是一个单独的子程序(什么保存栈地址,开辟局部变量空间,....都没有写,只是单独的平栈),今天我们就写一个Call变为函数调用的例子,一步一步的看为什么这么做,对以后的逆向很有帮助...标号: mov bp,sp   mov ax,[bp +2]   mov bx,[bp +4]   add ax,bx ret 我们压入了两个参数,一个Ax,一个Bx,在Call的时候,...返回 ,retf下面详细讲 在这里主要是掌握bp所在的位置即可,就能明白为什么这样写了,不信的话自己写个程序,看下反汇编,大体的就是这个套路,这里讲解的是为什么这样做,不是和市面的汇编视频一样,你看到...只要掌握bp所在的位置即可,上面的代码即可明白  3.Call指令的retf段间转移 这个我们首先要明白,在Call的时候会把Call下边一条指令的地址保存到栈中,出栈的时候要给IP,让其更改跳转, 跳转到...和Call差不对,Call的ret返回的时候会把栈顶的元素弹出两个字节,这两个字节是返回地址,所以可以回到正确的地方执行指令,但是IRET明显比ret保存的东西多,其中ret我们可以手工的pop和jmp

    1K100

    禁止指令重排是什么意思,为什么需要禁止指令重排以确保程序的正确性

    在并发编程中,有一种概念叫做指令重排,它可能会影响到程序的正确性,因此我们需要了解它并采取相应的措施来避免它的影响。本文将详细介绍禁止指令重排是什么意思,以及为什么需要禁止指令重排以确保程序的正确性。...指令重排的定义指令重排是指在多核 CPU 上同时执行多条指令时,为了提高执行效率,CPU 可能会对指令的执行顺序进行优化调整。这种优化技术被称为指令重排。...在指令重排过程中,CPU 有时可能会改变指令的执行顺序,但是这并不会影响到程序的输出结果,因为指令之间并没有依赖关系。...但是,在多核 CPU 上,由于指令重排的存在,CPU 可能会改变指令的执行顺序,例如:int x = 0;int y = 0;y++; // 指令重排x++; // 指令重排在这种情况下,x 和 y 的值都为...虽然这并不会影响到程序的输出结果,但是在某些特殊情况下,指令重排可能会导致程序产生错误,因此我们需要采取相应的措施来禁止指令重排。禁止指令重排的意义禁止指令重排的主要目的是确保程序的正确性和可靠性。

    66630

    2022-10-17:特殊的二进制序列是具有以下两个性质的二进制序列: 0 的数量与 1 的数量相等。 二进制序列的每一个前缀码中 1 的数量要大于等于 0 的

    2022-10-17:特殊的二进制序列是具有以下两个性质的二进制序列:0 的数量与 1 的数量相等。二进制序列的每一个前缀码中 1 的数量要大于等于 0 的数量。...给定一个特殊的二进制序列 S,以字符串形式表示。定义一个操作 为首先选择 S 的两个连续且非空的特殊的子串,然后将它们交换。...(两个子串为连续的当且仅当第一个子串的最后一个字符恰好为第二个子串的第一个字符的前一个字符)在任意次数的操作之后,交换后的字符串按照字典序排列的最大的结果是什么?输入: S = "11011000"。...经测试,rust和go的速度最快,go的内存占用最低。代码用rust编写。

    40010

    为什么老程序员的效率如此高?编程速度快,Bug数量又少?

    为什么老程序员编程速度快,Bug数量少? 之前看到一位程序员讲到:2个月前公司有一个35+的老程序员入职,和项目主管一个年纪,但是还是干技术,基本没话,就是干自己的。...学习心态 遇到新的东西或者问题,要去探一下究竟,搞明白原因; 不要忽略基础知识,往往大的项目都离不开基础知识的铺垫,而每位老程序员都是掌握了非常扎实的基础知识的; 找到适合自己的学习方法:关于学习方法的探讨很多很多...,只是我们貌似从来没有在意过,另外,切记只有适合自己的才是最好的,成功的人有很多,但是他们的路你不一定走得了,去寻找属于自己的学习方法论吧!...最后 不知不觉自己已经做了几年开发了,由记得刚出来工作的时候感觉自己能牛逼,现在回想起来感觉好无知。懂的越多的时候你才会发现懂的越少。...资料获取传送门:加群免费获取 Android架构设计大群(185873940) 群内有许多技术大牛,有任何问题,欢迎广大网友一起来交流,群内还不定期免费分享高阶Android学习视频资料和面试资料包~ 为什么某些人会一直比你优秀

    1.2K11

    3.9 控制转移指令

    返回主程序: 当子程序执行完毕并遇到 RET 指令时,返回地址会从堆栈中弹出,程序控制权会返回到主程序的 CALL 指令之后的指令继续执行。...当 SUBROUTINE 执行完 RET 指令时,程序返回到 CALL SUBROUTINE 之后的代码,继续执行主程序。 总结: CALL 指令用于实现子程序的调用,使得代码模块化、便于复用。...CALL 指令配合 RET 指令使用,确保程序在执行完子程序后能够正确返回到调用点继续执行。 5. 返回指令 在汇编语言中,RET 指令用于从子程序(或函数、过程)返回到调用该子程序的主程序位置。...RET 指令的工作原理: 从堆栈中弹出返回地址: 当 RET 指令被执行时,处理器会从堆栈中弹出先前 CALL 指令压入的返回地址。...当子程序执行到 RET 指令时,程序从堆栈中弹出返回地址,并跳回到 CALL SUBROUTINE 指令的下一条指令处,继续执行主程序。

    32310

    C函数原理

    首先在调用函数之前进行参数压栈,首先将参数列表中的参数从右至左,依次压栈,然后调用一句call指令,跳转到函数代码处,call指令主要有两个作用,一个是eip的值压入栈中,然后使用jmp指令,跳转到对应函数的实现位置...函数中的参数传递 从上面的代码中可以看出,函数的形参与实参并不是同一个变量,它们所在的内存地址不同,这样就解释了为什么形参的改变无法影响实参,只有通过传入地址才能改变实参。...函数的返回值 函数可以返回不同的值,一般利用return语句返回,但是在上面的说明中并没有这样的指令,唯一用来返回的ret指令,只是修改栈的内容并做一个跳转,并没有实际的返回什么,下面我们就来看看函数是如何返回值的...,所以这种方式也就可以提高程序的运行效率,但是寄存器数量是有限的,因此这种方式是采用寄存器与内存混合使用的方式来传递参数。...执行esp = ebp,时esp指向函数栈的栈底 11. pop ebp 还原之前保存的值,使ebp指向调用者的函数栈栈底 12. ret 返回或者ret n(n为整数)指令返回到调用者的下一句代码

    64630

    汇编语言知识总结

    寄存器靠近cpu,读写数据速度远大于内存 进行数据的临时存储 当然 cpu内部除了有寄存器之外,还有运算器和控制器, 对于我们程序员来讲,只需要学习寄存器即可 缓存 寄存器和缓存是两个概念, 由于cpu...,硬盘同理 为什么要了解寄存器 因为程序员如果想要操控cpu或者修改内存, 不能直接操控, 需要借助寄存器, 更改寄存器当中的数据间接地操控cpu和内存 寄存器的数量 在高级语言中如果要对两个变量进行数据交换...,也叫寻址 那么问题来了, 一栋公寓里一共有多少个单间呢, 或者说单间的数量跟什么有关呢?...str mov ah 9ch int 21h ret ;函数结尾标记 函数调用 x86架构中使用关键指令call, ARM架构中使用关键指令bl x86架构汇编示例: call..._B: add x0, x0,#0x10 ret ;返回到bl指令所对应的下一条指令 C语言内嵌汇编代码(GCC内联汇编) 格式 asm volatile( ;asm也可写成 __asm__

    3K20

    面试系列-4 hash应用场景分析实践

    hlen指令:hlen key 获取哈希表key中field的数量,不存在返回0;时间复杂度O(1)。 hmget指令:hmget key [field ...]...3、删除delete指令操作: hdel指令:hdel key field [field ...] 删除哈希表中一个或多个字段,不存在则忽略;时间复杂度O(n),n为要删除字段的数量。..., err = redis.call('set', _key, current_num + num) if ret then redis.call('expire...必须同时满足以下条件: 1、哈希表中保存的键值对不能大于512个 num < 512 2、哈希表中保存的所有键值字符串的长度不能大于64字节 length < 64 只有当全部满足以上条件,redis才会使用...为什么我们日常开发中要使用ziplist而不是hashtable?那么ziplist又是如何实现hash存储?面试官的两连问: 为什么使用ziplist?

    73050

    PWN|西湖论剑·2022中国杭州网络安全技能大赛初赛官方Write Up

    为了提高命中率,rop链上面可布置ret指令地址。...(一个0xff),然后读取了函数信息u8:函数id,u8:函数参数数量,u8:函数局部变量个数。...,len_args为参数数量,随后len_args个变量序号 5、攻击面寻找:上文已经分析过,此题不是堆溢出/栈溢出的题目,需要在JIT层找攻击面。...varib & 0x80u) == 0 ) { //变量序号最高位为0,访问参数 if ( varib > Compiler::ctx_args ) fatal(); //若序号大于当前函数的参数数量则报错...(imm64) 在正常条件下,指令会被解析为赋值,但我们可以通过劫持retaddr实现错位执行,即跳转到此条指令地址+2的地方,把imm64当作一条指令执行。

    62440

    16位汇编第九讲汇编指令以及逆向中的花指令

    什么是子程序   1.子程序是完成特定功能的一段程序   2.当主程序(调用程序)需要执行这个功能的时候,采用call调用指令转移到改子程序的起始处执行   3.当运行万子程序的功能的时候,采用 ret...这里主要介绍call传参,以及使用ret Call的原理是什么?   ...+2 mov bx,[bp+ 4] add ax,bx ret 在这里应该注意到了,我们用Call调用的时候,为什么函数内部要+2 原因是当这个子程序执行完毕的时候,需要返回到主程序执行...,所以主程序的下一条指令已经压栈了,所以+2位置,可以取得参数 最后调用ret平栈 当程序遇到ret的时候,做的事情 1....(sp栈顶) = (sp栈顶) + 2 需要注意的是,ret只会把最后压入的返回地址返回,但是参数还没有平栈,只能在调用完毕之后,在返回地址出的下一条指令自己平栈 4.Call的详细调用 mov cx,

    1.7K100

    【Android 逆向】x86 汇编 ( call 子函数调用指令 | jmp 跳转指令 | lea 加载指令 | mov 数据传送指令 )

    文章目录 一、call 子函数调用指令 二、jmp 跳转指令 三、lea 加载指令 四、mov 数据传送指令 总结 一、call 子函数调用指令 ---- call 指令是 子函数调用指令 , 调用的指令的下一条指令地址入栈..., ae 表示大于等于跳转 , nae 表示不大于等于跳转 即 小于跳转 ; 三、lea 加载指令 ---- lea 指令 : Load Effect Address 取地址值 , 将 数据地址 加载到...寄存器 中 , 方便进行批量数据处理 , 如批量复制 , 批量修改 ; 四、mov 数据传送指令 ---- mov 指令是数据传送指令 ; mov a1 , a2 指令的作用是 , 将 a2 中的值写入到...a1 中 ; 总结 ---- align 字节对齐 , db 声明字符 / 字符串 , nop 空指令 cmp 比较 , test 比较 call 子函数调用指令 , jmp 跳转指令 ( 可选参数..., pop , pushf , popf , pushd , popd , pushad , popad , pusha , popa ret , retn , set add , sub , mul

    1.6K10
    领券