首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

函数调用过程(帧)

开发环境 Ubuntu 14.04(32bits) GCC 编辑器 Cmd Markdown 画图工具 Processon 1,函数调用过程 今天先介绍下基本的函数调用过程,即帧。...1.1帧 每个函数调用都对应一个帧。每个帧由ESP和EBP寄存器来确定。每个函数执行时,其局部变量都是在自己对应的帧内分配内存。...假设A函数调用B函数,此时正在执行B函数,需要指出的是,当执行完当前函数B后,返回调用函数A,此时执行函数B时,为B函数的局部变量分配的的内存空间也就不存在了。...,此处将j的值压 movl 20(%esp), %eax //将变量i的值赋给eax寄存器 movl %eax, (%esp) //将变量i的值压 call test //调用test函数,...函数时,对应的帧见下图 当函数test返回后,main函数帧如下图

79020

关于函数参数入的思考(函数调用约定,入顺序)

int __cdecl function(int a,int b) // 明确指出C调用约定 约定的内容有: (1)参数入顺序是从右向左; (2)在被调用函数 (Callee) 返回后...和__stdcall类似,它约定的内容有: (1) 函数的第一个和第二个DWORD参数(或者尺寸更小的)通过ecx和edx传递,其他参数通过从右向左的顺序压; (2)被调用者清理堆栈;...由于成员函数调用还有一个this指针,因此必须特殊处理,thiscall意味着: (1) 参数从右向左入; (2) 如果参数个数确定,this指针通过ecx传递给被调用者;如果参数个数不确定,...this指针在所有参数压后被压入堆栈; (3)对参数个数不定的,调用者清理堆栈,否则函数自己清理堆栈。...这些操作完成之后,分别将dword ptr [ebp-0D0h]处的值、最终的i和i入。再三次调用cout.operator<<函数将它们输出。所以程序的最终结果是11,11,10。

2.4K31

JS执行上下文与调用

调用 调用是解析器(如浏览器中的的javascript解析器)的一种机制,可以在脚本调用多个函数时,跟踪每个函数在完成执行时应该返回控制的点。...(如什么函数正在执行,什么函数被这个函数调用,下一个调用函数是谁) 当脚本要调用一个函数时,解析器把该函数添加到中并且执行这个函数。...任何被这个函数调用函数会进一步添加到调用中,并且运行到它们被上个程序调用的位置。 当函数运行结束后,解释器将它从堆栈中取出,并在主代码列表中继续执行代码。...调用列表: - greeting 10.当 greeting() 函数中的所有内容都执行完之后,返回到它的调用行继续执行其余的JS代码。 11.把 greeting() 方法从调用列表中删除。...调用列表: 空 我们从一个空的调用开始,当我们调用一个函数时,它会自动添加到调用中,在执行完所有代码之后,它会自动从调用中删除。最后,我们也得到了一个空。 怎么创建执行上下文?

1.5K10

函数调用是如何变化的?

大家都知道函数调用是通过来实现的,而且知道在中存放着该函数的局部变量。但是对于的实现细节可能不一定清楚。本文将介绍一下在Linux平台下函数是如何实现的。...帧的结构 函数调用的时候都是在空间上开辟一段空间以供函数使用,所以,我们先来了解一下通用帧的结构。...在函数调用之前,调用者会为调用函数做准备。...由于rbp中的地址处总是“上一层函数调用时的rbp值”,而在每一层函数调用中,都能通过当时的%rbp值“向上(底方向)”能获取返回地址、参数值,“向下(顶方向)”能获取函数局部变量值。...通过的结构,可以知道,rbp上面就是调用函数调用调用函数的下一条指令的执行地址,所以需要赋值给rip,来找回调用函数里的指令执行地址。

2.9K21

VC 2015 调用查看主函数调用详情的设置

其实在进入 main 函数前,操作系统、编译器等已经做了很多工作了。只要在 VC 中,通过调用就可以看到相关一些内容。这里使用 VC 2015 来进行简单的演示。...通过CTRL + ALT + C 打开调用窗口,调用窗口如下所示。 可以看到,此时调用顶是 main 函数,也就是我们的代码当中。...通过调用可以看到,在 main 函数上面还有 “外部代码”,还有一个没有 kernel32.dll 符号的提示。这样已经可以看出,在 main 函数之前肯定是有相关的代码已经被执行了。...在调用窗口上单击右键,在弹出的菜单上选择 “显示外部代码”,在调用窗口中就会把 “外部代码” 显示出来,如下图所示。...@BaseThreadInitThunk@12() 已经被显示出来了,继续在 ntdll.dll 上进行加载,都加载完后的调用显示如下: 可以看到,调用中的调用关系的显示也都完整了。

18120

C语言函数调用帧结构

函数返回地址:保存当前函数调用前的“断点”信息,也就是函数调用前的指令位置,以便在函数返回时能够恢复到函数调用前的代码区中继续执行指令。...(1)这里首先main函数建立自己的帧结构;main()函数是由__tCRTStartup()函数调用的,所以mainCRTStratup()函数调用__tmainCRTStra()函数的时候就会从上为...函数fun的执行也许还会调用别的函数,甚至递归地调用foo本身。然而,只要EBP寄存器在这些子调用返回时被恢复,就可以继续用EBP加上偏移量的方式访问实际参数,局部变量和临时存储。...我们可以把参数一起弹出,这可以通过把指针实现:add esp, 8此时fun函数调用结束帧结构恢复至图一。...如果在函数调用前,EAX,ECX和EDX寄存器的值被保存在中,调用者main函数现在可以把它们弹出。这个动作之后,顶就回到了我们开始整个函数调用过程前的位置。这样整个函数调用就结束了

1.3K30

上理解 Go语言函数调用

基础知识 在 《一文教你搞懂 Go 中操作 https://www.luozhiyun.com/archives/513 》 中讲解了操作,但是对于上的函数调用来说还有很多知识点直接被忽略了,所以在这里继续看看函数调用相关知识...综上在函数调用中,关于参数的传递我们可以知道两个信息: 参数完全通过传递 从参数列表的右至左压 下面是调用 add 函数之前的调用调用详情: [call stack] 当我们准备好函数的入参之后...小结以下调用规则: 参数完全通过传递 从参数列表的右至左压 返回值通过传递,返回值的空间在参数之前 函数调用完毕后,调用方(caller)会负责的清理工作 结构体方法:值接收者与指针接收者...其实这段汇编和其他的函数调用的汇编是一样的,没啥好讲的,在调用 test 函数之前就是做了一些的初始化工作。...函数地址值存在 main 调用顶,然后调用完 test 函数之后会将存放在 (SP) 的 test.func1 函数地址值写入到 AX 中,然后执行调用下面的指令进行调用: 0x0031 00049

1.9K30

JS 调用机制与 ES6 尾调用优化介绍

调用的英文名叫做Call Stack,大家或多或少是有听过的,但是对于js调用的工作方式以及如何在工作中利用这一特性,大部分人可能没有进行过更深入的研究,这块内容可以说对我们前端来说就是所谓的基础知识...调用是一种结构的数据,它是由调用侦组成的。 调用记录了函数的执行顺序和函数内部变量等信息。...调用的运行机制 机制: 程序运行到一个函数,它就会将其添加到调用中,当从这个函数返回的时候,就会将这个函数调用中删掉。...现在可以使用“尾调用优化”来写一个“尾递归”,只保存一个调用侦,来防止爆问题。 注意: 只有不再用到外层函数的内部变量,内层函数调用帧才会取代外层函数调用帧。...更多: 关于尾递归以及更多尾调用优化的内容,推荐查阅ES6入门-阮一峰 调用debug大法 查看调用有什么用 查看函数调用顺序是否跟预期一致,比如不同判断调用不同函数

86020

js 调用机制与ES6尾调用优化介绍

本文中提到的链接,因为微信的限制,没有显示出来,查看文中链接,需要点击最下方的阅读原文链接 调用的英文名叫做Call Stack,大家或多或少是有听过的,但是对于js调用的工作方式以及如何在工作中利用这一特性...调用是一种结构的数据,它是由调用侦组成的。 调用记录了函数的执行顺序和函数内部变量等信息。...调用的运行机制 机制: 程序运行到一个函数,它就会将其添加到调用中,当从这个函数返回的时候,就会将这个函数调用中删掉。...在调用中每个“调用侦”都对应一个函数,最上方的调用帧称为“当前帧”,调用是由所有的调用侦形成的。...博客、前端积累文档、公众号、GitHub 以上2019/5/20 参考资料: JS垃圾回收机制与常见内存泄露的解决方法 ES6入门-阮一峰 JavaScript 如何工作:对引擎、运行时、调用堆栈的概述

66620

Js 使用new关键字调用函数和直接调用函数的区别

最近开始学习js,在看到书上的一个例子时,引发了我的一系列思考: 书上例子: function Person(name,age,job){ var o =new Object();...var person=Person("张三",20); //报错 person undefined 此处为普通函数调用,又没有给定返回值,出错。...person.sayName(); 得出结论:使用new关键字是将函数当作构造函数调用,即为构造对象,若没有人为的重写调用构造函数时返回的值,那么返回的对象是由解析器自己生成的。...不使用new关键字调用函数,即为普通函数调用。 随即想到若是函数返回值是function型的呢?...),虽然new函数与直接调用函数产生的结果等同,但是是两个不同的过程,一个是构造对象、一个是函数调用

3.6K10
领券