首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

汇编角度看函数堆栈调用

下面以主函数调用求和函数分析函数堆栈调用 带着以下一个问题来探索: (1)形参的内存空间的开辟和清理是由调用方还是由被调用方执行的? (2)主函数调用函数结束后,主函数从哪里开始执行?...从头开始还是从调用之后开始? (3)返回值是如何带出来的?...现在回答最开始我们提出的几个题: (1)形参的内存空间的开辟和清理是由调用方还是由被调用方执行的? (2)主函数调用函数结束后,主函数从哪里开始执行?从头开始还是从调用之后开始?...答: (1)形参的内存空间的开辟和清理是由调用方执行的。 (2)主函数调用函数后执行执行调用之后的代码,是因为调用方在进行调用的过程中,将下一行指令的地址压栈。...所以调用完成之后是从调用之后开始,不会从头开始。 (3)返回值是由累加寄存器eax带出来的(当返回值的字节数小于等于四个自己时)。

67420

【C语言】汇编角度剖析函数调用的整个过程

call指令是调用子程序,后面紧跟的应该是子程序名或者过程名。...call指令的下一条指令,同时esp指针地址+4字节(因为call下一条指令的IP被pop掉了) 004017BB C3 ret 二、函数栈帧的创建与销毁过程(从汇编角度去看...我们的esp在经过add汇编指令之后会向下移动8个字节的位置,正好跳过了我们为形参x y开辟的栈帧空间,此时也就是销毁了形参x y 读到这里我们今天的学习就结束了,我们讲解了Add函数在汇编角度下是如何被调用的...我们会在调用函数前进行函数参数的内容,进行一个压栈操作,当进入到被调用函数内部的时候,我们会通过指针的偏移量找到函数参数,并对其进行操作。...我们会通过汇编语言中的call指令,先将其下一条指令的IP压栈到我们的栈帧空间当中,并且指向call指令,会进入到被调用函数的汇编代码当中,进行被调用函数的汇编指令 并且我们函数调用结束后,通过ret指令能够回到上一层函数中

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

    从内核角度分析 listen() 系统调用的 backlog 参数作用

    编写服务端程序时,需要调用 listen() 系统调用来开始监听请求连接,listen() 系统调用的原型如下: int listen(int sockfd, int backlog); 可以看到,listen...() 系统调用需要传入两个参数,第一个 sockfd 表示监听的 socket 句柄,而 backlog 参数表示接收请求队列的长度。...listen() 系统调用在内核的实现 当我们在程序中调用 listen() 系统调用时,会触发调用内核的 sys_listen() 函数,sys_listen() 函数的实现如下: asmlinkage...步骤2 */             sockfd_put(sock);     }         return err; } sys_listen() 函数的实现比较简单,过程如下: 步骤1:首先调用...步骤2:通过调用 socket 对象的的 listen() 方法来进行监听操作。 对于 TCP协议 来说,socket 对象的 listen() 方法会绑定到 inet_listen() 函数。

    1.1K20

    从内核角度分析 listen() 系统调用的 backlog 参数作用

    编写服务端程序时,需要调用 listen() 系统调用来开始监听请求连接,listen() 系统调用的原型如下: int listen(int sockfd, int backlog); 可以看到,listen...() 系统调用需要传入两个参数,第一个 sockfd 表示监听的 socket 句柄,而 backlog 参数表示接收请求队列的长度。...listen() 系统调用在内核的实现 当我们在程序中调用 listen() 系统调用时,会触发调用内核的 sys_listen() 函数,sys_listen() 函数的实现如下: asmlinkage...步骤2:通过调用 socket 对象的的 listen() 方法来进行监听操作。 对于 TCP协议 来说,socket 对象的 listen() 方法会绑定到 inet_listen() 函数。...所以 步骤2 最后会调用 inet_listen() 函数,inet_listen() 函数的实现如下: int inet_listen(struct socket *sock, int backlog

    1.3K10

    从汇编角度来理解linux下多层函数调用堆栈运行状态

    我们用下面的C代码来研究函数调用的过程。...整个程序的执行过程是main调用foo,foo调用bar,我们用gdb跟踪程序的执行,直到bar函数中的int e = c + d;语句执行完毕准备返回时,这时在gdb中打印函数栈帧,因为此时栈已经生长到最大...所以下面的指令把参数a和b再次压栈,为调用bar函数做准备,然后把返回地址压栈,调用bar函数: 现在看bar函数的指令: int bar(int c, int d) {   80483dc:       ...实际上main函数也是被其他系统函数所调用的,比如进一步si 下去会发现 是 被 libc-start.c 所调用,最终还会调用exit.c。...此外可以看到调用call 时esp 应该为0xbffff6b0,与main 函数执行完毕时的esp 值一致。

    1.5K00

    【Flink】第二十四篇:源码角度分析 DataStream API 调用逻辑

    Flink】第十二篇:记kudu-connector写CDC数据的-D数据时,报主键不存在的异常 【Flink】第十五篇:Redis Connector 数据保序思考 【Flink】第十六篇:源码角度分析...从用户角度,形式上来讲,是对DataStream进行链式调用,每次调用都是一次业务逻辑语义的表达,即将DataStream进行一次转换。...这种面相DataStream的转换操作符合用户角度的调用习惯和思维方式,从用户角度来看DAG中的每个节点是一种DataStream。 Function:表达业务逻辑。...从Flink角度来看,Flink面向的DAG中各个节点是Transformation。 Operator:关注数据物理来源、序列化、数据转发、容错。...并调用addSource进行添加。

    80140

    从汇编角度来理解linux下多层函数调用堆栈运行状态

    我们用下面的C代码来研究函数调用的过程。...整个程序的执行过程是main调用foo,foo调用bar,我们用gdb跟踪程序的执行,直到bar函数中的int e = c + d;语句执行完毕准备返回时,这时在gdb中打印函数栈帧,因为此时栈已经生长到最大...所以下面的指令把参数a和b再次压栈,为调用bar函数做准备,然后把返回地址压栈,调用bar函数: 现在看bar函数的指令: int bar(int c, int d) {   80483dc:       ...实际上main函数也是被其他系统函数所调用的,比如进一步si 下去会发现 是 被 libc-start.c 所调用,最终还会调用exit.c。...此外可以看到调用call 时esp 应该为0xbffff6b0,与main 函数执行完毕时的esp 值一致。

    95620

    Java 函数调用是传值还是传引用?从字节码角度来看看 !

    下文将从字节码的角度,分析Java中基本类型传参和对象传参。 基本类型传参 以下是处理类Porcess,代码应该已经能够自解释了。...上文已经得到结论,我们从JVM的字节码的角度看一下过程是怎么样的。 首先大致JVM的基本结构,对基本类型,和对象存放的位置有一个大致的了解。下图是JVM的基本组件图。...下图是从另一个角度解析JVM的结构,JVM是基于栈来操作的,每一个线程有自己的操作栈,遇到方法调用时会开辟栈帧,它含有自己的返回值,局部变量表,操作栈,以及对常量池的符号引用。...在字节码第8行,通过bipush 18,将常量18直接压入操作栈,然后第20行,是调用了process的function3方法,传入了age作为参数。...6.然后执行至20:invokevirtula #6,也就是调用function3,进入function3的栈帧。

    1.5K30

    3分钟短文|Laravel命令行调用控制器方法,你会几个?

    今天要说的就是在laravel中,能不能在命令行中调用控制器的方法, 怎么去实现? 学习时间 为了快速测试控制器方法可不可行,我们有时候会想,能不能像这样在命令行直接访问某个控制器路由的方法。...于是我们想,既然laravel提供了artisan的命令行调用,何不先做一个命令,然后在命令内使用程序方法 调用控制器呢。说来就动手开写。 首先创建一个命令类。...然后重点来了,我们使用laravel框架提供的 Container 容器构造一个调用: app()->make(\Illuminate\Contracts\Http\Kernel::class)->handle...'); 然后使用全局容器盒子调用控制器对象的方法,并传送参数: app()->call([$cc, 'getCalendarV2'], ['filter[id]'=>1, 'anotherparam'...可见,laravel容器盒子这种设计理念,几乎可以跨任意区域调用, 提供的强大能力,非同寻常。

    1.8K10

    从执行上下文角度重新理解.NET(Core)的多线程编程:基于调用链的”参数”传递

    被系列文章从“执行上下文传播”这个令开发者相对熟悉的角度来聊聊重新认识我们似乎已经很熟悉的主题。...为了方便演示,我们定义了如下一个CallStackContext类型来表示基于某个调用链的上下文,这是一个字典,用于存放任何需要传递的数据。自增的TraceId字段代码当前调用链的唯一标识。...顾名思义,CallContext是专门为调用链创建的上下文,我们首先利用它来实现基于调用链的数据传递。...为了验证CallContext跨线程传递的能力,我们将Call方法改写成如下的形式:Call方法直接调用Foo方法,但是Foo方法针对Bar方法的调用,以及Bar方法针对Baz方法的调用均在一个新创建的线程中进行的...如果希望在进行异步调用的时候自动传递到目标线程,必须调用CallContext的LogicalSetData方法设置为LogicalCallContext。

    1.3K30

    iOS中纯代码创建的UI控件使用weak还是strong

    当我们在 touchsBegan方法中再调用这个控件的地址时: ? 发现strong-->该控件存在; ? weak -->控件销毁了!...此时,就算是弱引用的控件,出了作用域也还存在,未被销毁! --->华丽分割线:调用removeFromSuperView方法,可以查看weak 和 strong的区别: ?...当如果是 strong 指向的控件时,由于 当前的控制器 -->(强引用)指向 该控件:faceBtn,所以removeFromSuperView 无效!...移除了contentView的强引用,但是当前控制器的 强引用还存在,所以该控件不会被销毁! ? 但是,当我们使用weak的时候,----->华丽分割线! ?...虽然当前{ xxx }中,我们会发现 控件还未被释放,但是 如果再次使用的时候,我们对控件属性 使用weak 或者 strong 的区别,就出现了!!

    1.5K40

    天目MVC审计二

    本文章由二农戏猪编辑 审计控制器 从上一篇审计完了入口文件和搞清楚路由规则之后,我们开始正式审计控制器。...Home目录 从app/home/index.php开始审计,前面没什么可说的,但是注意这里,虽然它是判断不是PC登陆时候执行,但是我们可以看到它调用的查询方法,感觉很熟悉,比较像think里面定义的查询方法...image.png image.png 后台SQL注入 功夫不负有心人,我们在此处,发现$sid未被单引号包裹,并且未被强制转换未int类型。...get_category_list(),发现在home/controller/special.php中,category()这个方法中,通过GET传入的sid这个值,虽然这个方法中对$sid加有单引号保护,但是在调用...继续回溯 image.png 发现user\controller\articles.php出现调用,往上看,add方法。 image.png 注册账号并且开启发文章权限。

    47710

    2019年一线大厂春招:Spring面试题和答案合集(下篇)

    @Required 注解 这个注解表明bean的属性必须在配置的时候设置,通过一个bean定义的显式的属性值或通过自动装配,若@Required注解的bean属性未被设置,容器将抛出BeanInitializationException...Spring切面可以应用五种类型的通知: before:前置通知,在一个方法执行前被调用。 after: 在方法执行之后调用的通知,无论方法执行是否成功。...从客户端的角度看,代理对象和目标对象是一样的。 60. 有几种不同类型的自动代理?...什么是Spring MVC框架的控制器? 控制器提供一个访问应用程序的行为,此行为通常通过服务接口实现。控制器解析用户输入并将其转换为一个由视图呈现给用户的模型。...@Controller 注解 该注解表明该类扮演控制器的角色,Spring不需要你继承任何其他控制器基类或引用Servlet API。

    52720

    Unreal随笔系列1: 移动实现中的数学和物理

    ControlInputVector是Pawn的一个成员变量,记录了未被处理的上次输入。 这两个变量的计算和使用,稍后我们再剖析。这里出现了第一个知识点, 向量。...这里对向量进行加法, 也就是未被消耗的ControlInputVector对应的力和WorldAccel对应的力, 二者产生了一个合力....而在Rotator中,使用的是角度,所以这里要将角度转化为弧度。 在研究这个矩阵的使用时,我们回忆下如下数学知识和背景知识。 数学&背景知识 1. ...弧度&角度 弧度的定义, 弧长等于半径的弧, 对应的圆心角为1弧度。 一弧度对应多少度呢?根据周长公式,360角度对应的弧长是2π弧度。...所以: 1弧度=180/π角度 1角度=π/180弧度 DegreesToRadians函数的实现就遵循上面的公式。

    1K20

    零拷贝并非万能解决方案:重新定义数据传输的效率极限

    这个过程实际上是通过DMA(直接内存访问)控制器将磁盘数据拷贝到内核缓冲区中。然而,需要注意的是,由于内存空间较磁盘空间有限,因此存在一系列算法来确保pageCache占用的内存空间不过大。...此外,pageCache还使用了内存淘汰机制,在内存空间不足时,会淘汰最近最久未被访问的缓存。当在项目中使用 Redis 时,你一定知道如何使用它。...当调用read方法读取文件时,进程实际上会被阻塞在read方法的调用处,因为它需要等待磁盘数据的返回。...内核收到中断信号后,将数据从磁盘控制器缓存区拷贝到pageCache缓冲区。最后,内核会将pageCache中的数据再次拷贝到用户缓冲区,也就是用户态的内存中,然后read调用返回。...对于任何工作中遇到的问题,我们都可以从操作系统的角度寻找解决方法。今天这一篇其实就是来打破零拷贝的方案神话的,没有一种技术是最好的,只有最合适的方法。

    51620

    Flash写入性能下降问题

    本文主要从文件操作的角度看下写入性能问题。 说明:本文是基于参考文档1、2、3、4做的意译,中间加入了自己的理解。如有需要,可以参阅原文。...写文件时,它发送写入某个逻辑地址的指令给FTL;删除文件时,原来被该文件占用的逻辑地址被释放(实际上可能并未被删除,可以通过恢复工具恢复,除非已经被覆盖写过)。...TF卡控制器此时可能根本感知不到这个操作(FTL层就搞定了),在它看来,现在5个page中,3个被占用,2个空闲。...所以它告诉TF卡控制器,图片的前4KB覆盖第一个page,后8KB写入最后的两个page。控制器收到这个指令就傻眼了,因为在它看来只有最后的两个page可以被写入,另外一个page需要先擦除再写入。...删除文件的时候,操作系统发送TRIM命令给TF卡控制器,告诉它哪些page是被删除的。

    2.2K30
    领券