摘要:目录前言由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教前言由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教作者新晓故知作者新晓故知那些代码背后的故事那些代码背后的故事通过
目录
前言:●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!
当进入函数计算时,形参回头去找压栈时的空间的a、b对应的值!
此时所有指令回到main函数!main函数的栈帧交给esp,ebp进行维护!Add函数的栈帧销毁!别担心!z的值在寄存器eax中存放,安全着呢!
这时显现出最初在栈顶存储call指令的下一条指令地址的作用:
在进行函数调用结束后回到主函数,并从call指令的下一条指令开始执行!
1.局部变量的创建是首先为函数分配栈帧空间,栈帧空间初始化一部分空间后,再为局部变量分配一些空间!
2.局部变量不初始化的是随机值,因为创建的时候是随机放置的值!初始化后随机值被覆盖!
3.函数的传参是在未调用形参对应的函数(子函数)时通过push 操作将实参的值压栈,当真正进入形参函数时,在形参对应的函数(子函数)栈帧里通过指针的偏移量,找回形参,进行使用!
4.形参是在压栈时开辟的空间 ,它和实参只是在数值上相同的,空间上是独立的!
函数内部创建的静态变量是在全局变量空间开辟的!而以上介绍的是在栈区空间开辟的!
2.函数的形参可以理解为:不在形参对应的函数(子函数)的栈帧里,而在主函数main拓展的栈帧里!
注:本次编译环境为:Visual Stdio 2013 !
VS2013运行结果会一闪而过解决办法1:设置项目属性解决办法2:system("pause");
越高级的编译器越难以抽离函数栈帧分装的过程!
int 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;}
main函数也会被其他函数调用哦!
反汇编查看:
为a、b、c开辟空间并存值:
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/124090.html
摘要:这里分块讲解六函数栈帧的销毁过程一解析的作用是将栈顶的数据弹出,弹出数据储存到相应寄存器中。 ?前言? 读完这篇博客,你可以明白什么? ①局部变量到底是怎么在栈上创建的? ②为什么局部变量不初始化为随机值? ③函数是怎么传参的?传参的先后顺序是什么? ④形参和实参是什么关系? ⑤函数调用是怎...
摘要:语言深层理解函数中栈帧的创建与销毁引言引言问题一引言问题二引言问题三一栈的简单认识内存的简单了解栈的简单了解栈的定义栈的结构二寄存器与简单的汇编指令寄存器的定义寄存器的分类简单的汇编指令三栈帧的创建于销毁调试调用堆栈调 ...
摘要:变量占用个字节的空间,这里是将的个字节的第一个字节的地址存放在变量中,就是一个之指针变量。是指针变量作者新晓故知总结指针变量,用来存放地址的变量。 目录 前言:●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教! ...
阅读 1219·2021-11-22 13:54
阅读 1406·2021-11-22 09:34
阅读 2646·2021-11-22 09:34
阅读 3906·2021-10-13 09:39
阅读 3321·2019-08-26 11:52
阅读 3318·2019-08-26 11:50
阅读 1495·2019-08-26 10:56
阅读 1880·2019-08-26 10:44