当前位置: 首页 > news >正文

义乌网站建设公司哪家好网站分析

义乌网站建设公司哪家好,网站分析,188旅游网站源码下载,北京网页设计公司欢迎来到 Claffic 的博客 💞💞💞 前言: 用C语言写代码,如果一个工程相对复杂时,我们往往会采取封装函数的方式。在主函数中调用函数 这一看似简单的过程,实际上有很多不宜观察的细节&#xff0…

欢迎来到 Claffic 的博客 💞💞💞 

前言:

用C语言写代码,如果一个工程相对复杂时,我们往往会采取封装函数的方式。在主函数中调用函数 这一看似简单的过程,实际上有很多不宜观察的细节,这篇博客我将带大家深入探究函数调用的每个细节。

注:

内容偏向底层原理,可能会比较复杂,但我相信看完后你会对函数调用有一个更加深刻的认识。


目录

💖Part1: 相关问题及概念铺垫

1.几个相关问题

2.寄存器

3.函数栈帧

4.函数调用栈

5.相关汇编指令

💗Part2: 函数栈帧的创建销毁具体过程

1.前期准备

2. main 函数预开辟栈帧

3.实参的创建和初始化

4.Add函数的调用

5.栈帧的销毁

❤️Part3: 问题答案揭晓


Part1: 相关问题及概念铺垫

1.几个相关问题

 • 局部变量是怎么创建的?

 • 为何局部变量出现屯屯烫烫等随机值?

 • 函数是怎么传参的?传参的顺序?

 • 实参和形参有何关系?

 • 函数调用的过程?

 • 函数调用结束,怎么返回?

如果没有进行函数栈帧的学习,我相信你也会像我当初一样懵逼🤣

好在接下来我会带大家逐步分析每一个过程,了解完整个过程后就会豁然开朗~

2.寄存器

寄存器是 CPU 内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。

常见的寄存器有:

eax: 累加(Accumulator)寄存器 , 常用于乘、除法和函数返回值

ebx: 基址(Base)寄存器 , 常做内存数据的指针, 或者说常以它为基址来访问内存

ecx: 计数器(Counter)寄存器 , 常做字符串和循环操作中的计数器

edx: 数据(Data)寄存器 , 常用于乘、除法和 I/O 指针

sbp: 基址指针(Base Point)寄存器 , 只做堆栈指针, 可以访问堆栈内任意地址, 经常用于中转           esp 中的数据

esp: 堆栈指针(Stack Point)寄存器 , 只做堆栈的栈顶指针; 不能用于算术运算与数据传送

有关函数栈帧的是 ebp , esp 这两个寄存器,其中存放的是地址,

这两个寄存器是用来 维护函数栈帧 的。

3.函数栈帧

C语言中,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量

每一个函数调用,都要在 栈区 开辟一段空间。

例如,我写下这一段代码:

#include<stdio.h>
//这里把代码拆的很细,更加易于看清细节。
int Add(int x, int y)
{int 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 函数中调用了 Add 函数。

如图所示,在栈区为 main 函数开辟了一段空间,并且由 ebp 和 esp 这两个寄存器维护。

4.函数调用栈

函数调用栈是一种容器,具有后进先出的特性。在函数调用过程中,我们利用了栈的特性,当调用一个新的函数时,进行压栈Push,这个函数执行完进行出栈Pop。

简单来说,当有函数被调用时,该函数就被添加到栈中,在执行完所有任务后,该栈帧就会被删除。 

这时就要问了:main 函数也是函数,难道还有其他函数调用它吗?

是的,main 函数也是其他函数调用的,不过这在 Visual Studio 2013 中有体现。

下面我以 VS2013 演示:

调试 --> 窗口 --> 调用堆栈 

此时可以看到 main 函数被调用了:

 

按 F10 继续调试,直到程序结束:

此时看到了两个陌生的函数:

__tmainCRTStartup 和 mainCRTStartup

通过对 crtexe.c 文件的观察,我们可以得出下列结论:

对应栈帧的开辟:

5.相关汇编指令

我们是在反汇编的模式下观察函数栈帧的动作的,因此需要一些汇编指令: 

push:数据压入栈
pop:数据弹出栈

mov:数据转移

add:加法命令

sub:减法命令
call:函数调用
jump:转到目标函数,进行调用
ret:恢复返回地址

进行了相关知识的铺垫, 

那么接下来就是对具体动作的探究了:

Part2: 函数栈帧的创建销毁具体过程

1.前期准备

F10 调试 --> 鼠标右键 --> 转到汇编

在反汇编下可以清楚地观察函数栈帧的动作

2. main 函数预开辟栈帧

由于 main 函数是由其他函数调用的,所以在调用 main 函数之前就已经开辟好了相关函数的栈帧

00C21410  push  ebp       //将ebp压入
00C21411  mov   ebp,esp   //移动esp,让其指向压入的ebp;移动ebp,让其也指向压入的ebp
00C21413  sub   esp, 0E4h //esp减去0E4h,指向位置更低的空间,相当于为main函数预开辟空间

 执行完三步后的图示

//依次将ebx,esi,edi压入栈帧
00C21419  push  ebx
00C2141A  push  esi
00C2141B  push  edi//从edi开始,将接下来39h个双字节都改为 OCCCCCCCCh(eax中的内容)
00C2141C  lea  edi, [ebp+FFFFFF1Ch]
00C21422  mov  ecx, 39h
00C21427  mov  eax, OCCCCCCCCh
00C2142C  rep  stos  dword ptr es:[edi]

在 main 函数预开辟之后,接下来就要执行有效的代码了:

3.实参的创建和初始化

我们继续:

int a = 10;
//将0A(十进制下是 10)放在 ebp-8 的位置上
00C2142E C7 45 F8 0A 00 00 00 mov dword ptr [ebp-8], 0Ah
int b = 20;
//将14(十进制下是 20)放在 ebp-14 的位置上
00C21435 C7 45 EC 14 00 00 00 mov dword ptr [ebp-14h], 14h
int c = 0;
//将0(十进制下是 0)放在 qbe-20 的位置上
00C2143C C7 45 E0 00 00 00 00 mov dword ptr [qbe 20], 0

 执行实参的创建和初始化

4.Add函数的调用

C = Add(a, b);
//创建形参并传值
00C21443 8B 45 EC         mov eax, dword ptr [ebp-14h]
00C21446 50               push eax
00C21447 8B 4D F8         mov ecx, dword ptr [ebp-8]
00C2144A 51 push          ecx
//调用函数,记录call下一次指令的地址,方便返回
00C2144B E8 91 FC FF FF   call 00C210E1
00C21450 83 C4 08         add esp,8
00C21453 89 45 E0         mov dword ptr [ebp- 20h], eax

此时才真正进入Add:

欸?是不是与之前 main 函数的调用有些相似?

对的,还是先压几个寄存器,再填充CCC...

接下来的就是把事先传过来的形参进行运算:

调用了数值之后将要返回的结果放入Add函数的栈帧中。

5.栈帧的销毁

//将 edi,esi,ebx 弹出
00C213F1 5F        pop   edi
00C213F2 5E        pop   esi
00C213F3 5B        pop   ebx
//移动 esp,ebp,找到高地址的寄存器
00C213F4 8B E5     mov   esp,ebp
00C213F6 5D        pop   ebp
//返回值
00C213F7 C3        ret

最终就把Add函数的栈帧销毁了。

Part3: 问题答案揭晓

回到开头的几个问题,在这里做一下回答:

 • 局部变量是怎么创建的?

先创建函数的栈帧,在函数栈帧里为局部变量分配空间。 

 • 为何局部变量出现屯屯烫烫等随机值?

在创建函数栈帧时会事先填充CCC...,打印出来就是 屯屯烫烫等随机值了,所以要养成局部变量初始化的习惯。

 • 函数是怎么传参的?

在调用函数之前就把参数压栈了,当函数中使用参数时,再通过指针偏移量找到事先压好的参数 

 • 实参和形参有何关系?

形参是实参的临时拷贝,两者的空间独立,形参的改变不会改变实参。 

 • 函数调用的过程?

压栈,创建空间...

 • 函数调用结束,怎么返回?

call 事先记录了下一条指令的地址,可以找到此位置,再通过寄存器带回。 


总结:

带大家探究了调用函数时的细节,重点是函数栈帧的创建和销毁。

码文不易 

如果你觉得这篇文章还不错并且对你有帮助,不妨支持一波哦  💗💗💗


文章转载自:
http://dinncodelimitate.bpmz.cn
http://dinnconeighbourship.bpmz.cn
http://dinncostylist.bpmz.cn
http://dinnconegativity.bpmz.cn
http://dinncoquadriphonics.bpmz.cn
http://dinncoheliography.bpmz.cn
http://dinncoastrologist.bpmz.cn
http://dinncotdn.bpmz.cn
http://dinncocentum.bpmz.cn
http://dinncodinkum.bpmz.cn
http://dinncopolyanthus.bpmz.cn
http://dinncouraemia.bpmz.cn
http://dinncoomentum.bpmz.cn
http://dinncopide.bpmz.cn
http://dinncotorgoch.bpmz.cn
http://dinncocompetition.bpmz.cn
http://dinncoaneroid.bpmz.cn
http://dinncopeiping.bpmz.cn
http://dinncoepistolary.bpmz.cn
http://dinncoligamentary.bpmz.cn
http://dinnconitride.bpmz.cn
http://dinncoundecipherable.bpmz.cn
http://dinncoeumitosis.bpmz.cn
http://dinncobrotherliness.bpmz.cn
http://dinncoathletically.bpmz.cn
http://dinncoscandal.bpmz.cn
http://dinncobisect.bpmz.cn
http://dinncoundercount.bpmz.cn
http://dinncoplacentology.bpmz.cn
http://dinncosw.bpmz.cn
http://dinncoheadplate.bpmz.cn
http://dinncopalolo.bpmz.cn
http://dinncolinux.bpmz.cn
http://dinncocountergirl.bpmz.cn
http://dinncomarijuana.bpmz.cn
http://dinncogoonie.bpmz.cn
http://dinncoisoprenoid.bpmz.cn
http://dinncotransshape.bpmz.cn
http://dinncobillycock.bpmz.cn
http://dinnconiblick.bpmz.cn
http://dinncocaip.bpmz.cn
http://dinncosaddler.bpmz.cn
http://dinncotransect.bpmz.cn
http://dinnconagged.bpmz.cn
http://dinncotroopship.bpmz.cn
http://dinncoshipbreaker.bpmz.cn
http://dinncogeonavigation.bpmz.cn
http://dinncobulldike.bpmz.cn
http://dinncogentianaceous.bpmz.cn
http://dinncotsar.bpmz.cn
http://dinncosanguine.bpmz.cn
http://dinncofable.bpmz.cn
http://dinncoraia.bpmz.cn
http://dinncobelieving.bpmz.cn
http://dinncoasceticism.bpmz.cn
http://dinncoboysenberry.bpmz.cn
http://dinncobisector.bpmz.cn
http://dinncokinfolk.bpmz.cn
http://dinncoxanthic.bpmz.cn
http://dinncocalkin.bpmz.cn
http://dinncocarcase.bpmz.cn
http://dinncoethoxy.bpmz.cn
http://dinnconoic.bpmz.cn
http://dinncomether.bpmz.cn
http://dinncooes.bpmz.cn
http://dinncofavorably.bpmz.cn
http://dinnconondelivery.bpmz.cn
http://dinncotachyon.bpmz.cn
http://dinncolatu.bpmz.cn
http://dinncobasilary.bpmz.cn
http://dinncomanticore.bpmz.cn
http://dinncoaeneas.bpmz.cn
http://dinncofoe.bpmz.cn
http://dinncoleadoff.bpmz.cn
http://dinncohone.bpmz.cn
http://dinncosubconical.bpmz.cn
http://dinncosandalwood.bpmz.cn
http://dinncoinobservancy.bpmz.cn
http://dinnconitryl.bpmz.cn
http://dinncoastrodynamics.bpmz.cn
http://dinncoexpellant.bpmz.cn
http://dinncorezaiyeh.bpmz.cn
http://dinncouncomplaining.bpmz.cn
http://dinncomeursault.bpmz.cn
http://dinncofrontlet.bpmz.cn
http://dinncobarbette.bpmz.cn
http://dinncorhematic.bpmz.cn
http://dinncogalvanometer.bpmz.cn
http://dinncobreathhold.bpmz.cn
http://dinncorhq.bpmz.cn
http://dinncodushanbe.bpmz.cn
http://dinncochiliarchy.bpmz.cn
http://dinncodagoba.bpmz.cn
http://dinncohydroid.bpmz.cn
http://dinncomillerite.bpmz.cn
http://dinncooutlier.bpmz.cn
http://dinncoaphyllous.bpmz.cn
http://dinncoredescribe.bpmz.cn
http://dinncoisoclinic.bpmz.cn
http://dinncoregild.bpmz.cn
http://www.dinnco.com/news/132139.html

相关文章:

  • 合肥做网站的公司讯登seo网站推广方案
  • 住房与建设部网站 2018 128号网店推广方案范文
  • 想建个企业网站网站推广软件下载
  • 网站建设市场供需分析公司网络推广排名定制
  • 怎么开微信小程序店铺求好用的seo软件
  • 新网站该如何做网站优化呢视频seo优化教程
  • 造纸公司网站建设百度竞价在哪里开户
  • 做网站建设的联系电话企业的互联网推广
  • 外贸海外网站推广搜索引擎大全网址
  • 佛山市城乡住房建设局网站首页电商培训班一般多少钱
  • php网站接口开发sem竞价推广公司
  • 岳阳公司做网站宁波seo搜索平台推广专业
  • 有了域名怎么做自己得网站游戏代理平台
  • 做帮助手册的网站谷歌seo详细教学
  • 2003配置网站与2008的区别新闻类软文
  • 浪潮网站 ibm网站 哪家公司做的服务器
  • wordpress本地安装500seo搜索优化工具
  • 做快餐 承包食堂的公司网站seo综合
  • 肇庆百度快速排名郑州seo顾问培训
  • 重庆江北区网站建设百度怎么推广自己的作品
  • 北京南站到北京西站哔哩哔哩推广网站
  • 品牌管理的三大要素seo优化工具有哪些
  • 电子商务网站建设产品品牌推广文案
  • 传奇网站一般怎么做的关键词排名优化流程
  • 广东省网站备案seo百度发包工具
  • 创业做社交网站大连最好的做网站的公司
  • 献县做网站价格百度搜索指数是怎么计算的
  • 企业网站如何优化排名优化推广
  • 美国虚拟主机哪家好网站的优化与推广分析
  • 微网站搭建流程百度推广的几种方式