摘要:函数栈帧的销毁汇编语言了解函数传参函数返回值如何返回函数中变量如何初始化和赋值函数执行结束后系统进行了什么操作
eax, ebx, ecx ...
ebp - 存放了指向函数栈帧栈底的地址
esp - 存放了指向函数栈帧栈顶的地址
函数被调用时,系统会在栈区为该函数开辟一块栈空间,这个栈空间就是该函数的函数栈帧。
以main函数的调用为例
栈帧也叫过程活动记录,是编译器用来实现函数调用过程的一种数据结构。从逻辑上讲,栈帧为一个函数提供了执行环境。
栈是先用高地址再用低地址,栈帧控制和保存了一个函数所需要的各种信息。
栈帧的维护离不开ebp和esp寄存器,ebp存放了指向栈帧的栈底地址的指针,esp则存放指向栈顶地址的指针。
以main函数为例:
环境为VS2019
#includeint ADD(int x, int y){ int z=0; z=x+y; return z;}int main(){ int a = 10; int b = 20; int c = 0; c = ADD(a, b); return 0;}
要研究函数栈帧我们要研究c程序的汇编代码。如图所示:
main函数的函数栈帧的创建和数据初始化就完成了。
add函数栈帧的创建和main函数栈帧创建是一样的,值得注意的是,ADD函数执行结束后的返回值保存在了寄存器eax中,就是避免ADD函数栈帧销毁时,主函数无法访问ADD返回值。由此可见函数返回值是如何返回的。
1.函数传参
2.函数返回值如何返回
3.函数中变量如何初始化和赋值
5.函数执行结束后系统进行了什么操作
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/119302.html
摘要:这里分块讲解六函数栈帧的销毁过程一解析的作用是将栈顶的数据弹出,弹出数据储存到相应寄存器中。 ?前言? 读完这篇博客,你可以明白什么? ①局部变量到底是怎么在栈上创建的? ②为什么局部变量不初始化为随机值? ③函数是怎么传参的?传参的先后顺序是什么? ④形参和实参是什么关系? ⑤函数调用是怎...
摘要:调用栈是一种栈结构它用来存储计算机程序执行时候其活跃子程序的信息。调用栈是解析器的一种机制。并形成一个栈帧任何被这个函数调用的函数会进一步添加到调用栈中,形成另一个栈帧并且运行到它们被上个程序调用的位置。然后调用栈继续运行其他部门。 大家在进行javascript开发的时候,有没有想过,我们写的代码是怎么样运行的呢?下面我们就来剖析一下代码的执行过程。 一 什么是调用栈 代码在运行过程...
摘要:定义默认参数要牢记一点默认参数必须指向不变对象尾递归调用函数本身,但是的返回值不包含表达式。而尾指针相当于把常规的递归反过来,增加一层递归的同时释放前一个递归指针,所以能够始终保持只有一个栈帧在使用中。 教程 1、python大小写敏感 如果字符串里面有很多字符都需要转义,就需要加很多,为了简化,Python还允许用r表示内部的字符串默认不转义 >>> print ...
摘要:下文将从字节码的角度,分析中基本类型传参和对象传参。主函数执行时,操作栈会推入主函数栈帧,其中包含了主函数的局部变量表,字节码,返回值等信息。主函数的栈帧会被推入栈,成为当前操作栈。 个人网站地址: http://kailuncen.me/2017/06/0... 一个小问题 在开源中国看到这样一则问题 https://www.oschina.net/quest...,其中的变量a前...
阅读 2520·2021-11-24 10:20
阅读 2357·2021-09-10 10:51
阅读 3351·2021-09-06 15:02
阅读 3077·2019-08-30 15:55
阅读 2819·2019-08-29 18:34
阅读 3035·2019-08-29 12:14
阅读 1178·2019-08-26 13:53
阅读 2888·2019-08-26 13:43