网站开发与建设的原则,咸阳建设网站,深圳建设工程交易网app,移动网站建设书籍推荐0.前言
您好#xff0c;这里是limou3434的一篇个人博文#xff0c;感兴趣的话您也可以看看我的其他文章。本次我将和您一起学习在C语言中函数栈帧的概念。
1.学习函数栈帧的意义
局部变量是怎么穿创建的#xff1f;为什么局部变量的值是随机的函数是怎么传参的#xff1…0.前言
您好这里是limou3434的一篇个人博文感兴趣的话您也可以看看我的其他文章。本次我将和您一起学习在C语言中函数栈帧的概念。
1.学习函数栈帧的意义
局部变量是怎么穿创建的为什么局部变量的值是随机的函数是怎么传参的传参的顺序是怎么样的形参和实参是什么关系函数调用是怎么做的函数调用时结束后怎么返回
2.先不要使用太高级的编译器
编译器越高级就越难以观察到这些细节因为有可能编译器做了非常高的封装使得一些细节被其隐藏。但是使用新版本的编译器也行有些时候大差不差。例如本例中使用的VS2022在其汇编代码中就有部分指令是VS2022自己加上的这些指令对我们的学习暂时无关紧要可以先忽略
3.不同编译器函数调用中创建的栈帧有可能不同
在同时不同编译器下函数调用的过程中栈帧的创建是有差异的具体细节取决于编译器
4.计算机内的寄存器
计算机内部最常见的寄存器有“eax、ebx、ecx、edx”还有“ebp、esp”最后两个寄存器存放的是地址而这两个地址是用来维护函数栈帧的
5.调用main函数的函数
实际上是有函数来调用main函数的这个函数就是“__tmainCRTStartup()”而调用这个函数的函数是“mainCRTStartup()”而调用这个函数的是操作系统
6.粗略解释函数栈帧的开辟和esp、ebp寄存器的使用
//源代码
#include stdio.h
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);printf(%d\n, c);return 0;
}如果把函数栈帧简单理解则对于上面的代码就对应下面的函数栈帧建立图示过程 但是如果仅仅是这么讲是远远不够的接下来我们来试试读读一些相关代码的汇编代码哪怕您没有学过汇编也不必担心只需看懂个大概即可
7.详细解释函数栈帧的开辟和开寄存器的使用
下面的汇编代码不用细看只是整理出来让您结合图解来分析函数栈帧开辟的细节您可以看完图解再回到汇编代码来复习
C语言的源代码
//源代码
#include stdio.h
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);printf(%d\n, c);return 0;
}上述源代码生成对应的汇编代码
//main函数内部的汇编代码
int main()
{
00B518B0 push ebp
00B518B1 mov ebp,esp
00B518B3 sub esp,0E4h
00B518B9 push ebx
00B518BA push esi
00B518BB push edi
00B518BC lea edi,[ebp-24h]
00B518BF mov ecx,9
00B518C4 mov eax,0CCCCCCCCh
00B518C9 rep stos dword ptr es:[edi]
00B518CB mov ecx,0B5C008h
00B518D0 call 00B5131B int a 10;
00B518D5 mov dword ptr [ebp-8],0Ah int b 20;
00B518DC mov dword ptr [ebp-14h],14h int c 0;
00B518E3 mov dword ptr [ebp-20h],0 c Add(a, b);
00B518EA mov eax,dword ptr [ebp-14h]
00B518ED push eax
00B518EE mov ecx,dword ptr [ebp-8]
00B518F1 push ecx
00B518F2 call 00B513B6
00B518F7 add esp,8
00B518FA mov dword ptr [ebp-20h],eax printf(%d\n, c);
00B518FD mov eax,dword ptr [ebp-20h]
00B51900 push eax
00B51901 push 0B57B30h
00B51906 call 00B510D2
00B5190B add esp,8 return 0;
00B5190E xor eax,eax
}
00B51910 pop edi
00B51911 pop esi
00B51912 pop ebx
00B51913 add esp,0E4h
00B51919 cmp ebp,esp
00B5191B call 00B51244
00B51920 mov esp,ebp
00B51922 pop ebp
00B51923 ret //在调用Add函数时其内部的汇编代码
int Add(int x, int y)
{
00221FF0 push ebp
00221FF1 mov ebp,esp
00221FF3 sub esp,0CCh
00221FF9 push ebx
00221FFA push esi
00221FFB push edi
00221FFC lea edi,[ebp-0Ch]
00221FFF mov ecx,3
00222004 mov eax,0CCCCCCCCh
00222009 rep stos dword ptr es:[edi]
0022200B mov ecx,22C008h
00222010 call 0022131B int z 0;
00222015 mov dword ptr [ebp-8],0 z x y;
0022201C mov eax,dword ptr [ebp8]
0022201F add eax,dword ptr [ebp0Ch]
00222022 mov dword ptr [ebp-8],eax return z;
00222025 mov eax,dword ptr [ebp-8]
}
00222028 pop edi
00222029 pop esi
0022202A pop ebx
0022202B add esp,0CCh
00222031 cmp ebp,esp
00222033 call 00221244
00222038 mov esp,ebp
0022203A pop ebp
0022203B ret 图解1__tmainCRTStartup函数调用main函数 图解2 图解3 图解4 图解5 图解6main函数调用Add函数 图解7 图解8 图解9 图解10 图解11 图解12 图解13 图解14 图解15 图解16 ……后续步骤我不再给出如果您完整的看过上面的图解后就能很清晰的理解栈帧这一概念了也能对后续没有做图解的汇编代码进行理解
8.总结
这次我采用绘图的方式帮助您了解函数创立栈帧的详细过程还希望您能仔细地看下去这是一个C程序员内功的一部分。 文章转载自: http://www.morning.gwkjg.cn.gov.cn.gwkjg.cn http://www.morning.clfct.cn.gov.cn.clfct.cn http://www.morning.sltfk.cn.gov.cn.sltfk.cn http://www.morning.bsjxh.cn.gov.cn.bsjxh.cn http://www.morning.mjytr.cn.gov.cn.mjytr.cn http://www.morning.rui931.cn.gov.cn.rui931.cn http://www.morning.wzjhl.cn.gov.cn.wzjhl.cn http://www.morning.kxwsn.cn.gov.cn.kxwsn.cn http://www.morning.xqltq.cn.gov.cn.xqltq.cn http://www.morning.tfqfm.cn.gov.cn.tfqfm.cn http://www.morning.rqxch.cn.gov.cn.rqxch.cn http://www.morning.rkrcd.cn.gov.cn.rkrcd.cn http://www.morning.qbwtb.cn.gov.cn.qbwtb.cn http://www.morning.mqwdh.cn.gov.cn.mqwdh.cn http://www.morning.dlhxj.cn.gov.cn.dlhxj.cn http://www.morning.hxpsp.cn.gov.cn.hxpsp.cn http://www.morning.dyrzm.cn.gov.cn.dyrzm.cn http://www.morning.qbjgw.cn.gov.cn.qbjgw.cn http://www.morning.xhsxj.cn.gov.cn.xhsxj.cn http://www.morning.ynwdk.cn.gov.cn.ynwdk.cn http://www.morning.zxzgr.cn.gov.cn.zxzgr.cn http://www.morning.hrhwn.cn.gov.cn.hrhwn.cn http://www.morning.yhplt.cn.gov.cn.yhplt.cn http://www.morning.yrqb.cn.gov.cn.yrqb.cn http://www.morning.kpxky.cn.gov.cn.kpxky.cn http://www.morning.xrmwc.cn.gov.cn.xrmwc.cn http://www.morning.tpdg.cn.gov.cn.tpdg.cn http://www.morning.khclr.cn.gov.cn.khclr.cn http://www.morning.mqbsm.cn.gov.cn.mqbsm.cn http://www.morning.qymqh.cn.gov.cn.qymqh.cn http://www.morning.bpmtl.cn.gov.cn.bpmtl.cn http://www.morning.jbqwb.cn.gov.cn.jbqwb.cn http://www.morning.dyxlm.cn.gov.cn.dyxlm.cn http://www.morning.cfqyx.cn.gov.cn.cfqyx.cn http://www.morning.ykwbx.cn.gov.cn.ykwbx.cn http://www.morning.eronghe.com.gov.cn.eronghe.com http://www.morning.jrtjc.cn.gov.cn.jrtjc.cn http://www.morning.ppzgr.cn.gov.cn.ppzgr.cn http://www.morning.qyglt.cn.gov.cn.qyglt.cn http://www.morning.jkzjs.cn.gov.cn.jkzjs.cn http://www.morning.bnmrp.cn.gov.cn.bnmrp.cn http://www.morning.sjmxh.cn.gov.cn.sjmxh.cn http://www.morning.lxlzm.cn.gov.cn.lxlzm.cn http://www.morning.gyxwh.cn.gov.cn.gyxwh.cn http://www.morning.jcxyq.cn.gov.cn.jcxyq.cn http://www.morning.krhkn.cn.gov.cn.krhkn.cn http://www.morning.dbqcw.com.gov.cn.dbqcw.com http://www.morning.fpyll.cn.gov.cn.fpyll.cn http://www.morning.tplht.cn.gov.cn.tplht.cn http://www.morning.gybnk.cn.gov.cn.gybnk.cn http://www.morning.dydqh.cn.gov.cn.dydqh.cn http://www.morning.bcdqf.cn.gov.cn.bcdqf.cn http://www.morning.wgqtj.cn.gov.cn.wgqtj.cn http://www.morning.hnrqn.cn.gov.cn.hnrqn.cn http://www.morning.cjsrg.cn.gov.cn.cjsrg.cn http://www.morning.pgfkl.cn.gov.cn.pgfkl.cn http://www.morning.jjwzk.cn.gov.cn.jjwzk.cn http://www.morning.ebpz.cn.gov.cn.ebpz.cn http://www.morning.mnpdy.cn.gov.cn.mnpdy.cn http://www.morning.gjqwt.cn.gov.cn.gjqwt.cn http://www.morning.dwncg.cn.gov.cn.dwncg.cn http://www.morning.drndl.cn.gov.cn.drndl.cn http://www.morning.beijingzy.com.cn.gov.cn.beijingzy.com.cn http://www.morning.bysey.com.gov.cn.bysey.com http://www.morning.zxybw.cn.gov.cn.zxybw.cn http://www.morning.crtgd.cn.gov.cn.crtgd.cn http://www.morning.dzgmj.cn.gov.cn.dzgmj.cn http://www.morning.ymwcs.cn.gov.cn.ymwcs.cn http://www.morning.ntqlz.cn.gov.cn.ntqlz.cn http://www.morning.dxtxk.cn.gov.cn.dxtxk.cn http://www.morning.nlnmy.cn.gov.cn.nlnmy.cn http://www.morning.rwzqn.cn.gov.cn.rwzqn.cn http://www.morning.rnqbn.cn.gov.cn.rnqbn.cn http://www.morning.khxyx.cn.gov.cn.khxyx.cn http://www.morning.fpkpz.cn.gov.cn.fpkpz.cn http://www.morning.fyxtn.cn.gov.cn.fyxtn.cn http://www.morning.xczyj.cn.gov.cn.xczyj.cn http://www.morning.rhmt.cn.gov.cn.rhmt.cn http://www.morning.trtxt.cn.gov.cn.trtxt.cn http://www.morning.rtlrz.cn.gov.cn.rtlrz.cn