C#编程之C#中的函数(-) 无参无返回值的函数
小标 2018-11-14 来源 : 阅读 2407 评论 0

摘要:本文主要向大家介绍了C#编程之C#中的函数(-) 无参无返回值的函数,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

本文主要向大家介绍了C#编程之C#中的函数(-) 无参无返回值的函数,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

分析下C#中的函数
先写一个小例子,一个静态函数,无返回值,无形参
在第17行与20行分别下断点

F5调试运行,此时中断在第17行MyFunction(),

在第17行右键反汇编,看下反汇编代码
这里的Call 002D0C30  对应用就是MyFunction()

此时F11直接进入MyFunction函数内部查看我们函数

002D2CA0就是MyFunction的入口,这里就有疑问了,明明上面Call 002D0C30,这里为什么是002D2CA0呢?
 在地址栏上转到002D0C30,结果VS提示无法指定地址,当前地址处没有代码……Fuck VS

难道我们就这么放弃了吗?NO…换一种方式,用第三方调试器附加我们的控制台程序

一下就明了了,原来执先完call 002D0C30这条语句, 进入的不是我们的函数MyFunction,
而是先是入到002D0C30里,执行jmp 002D2CA0语句,再跳转到真正的MyFunction函数入口.
总结下: call 002D0C30-> 002D0C30 jmp 002D2CA0->002D2CA0(MyFunction真正的函数入口)
接着分析下堆栈,这里能看到的是调用堆栈,而我关心的是当前堆栈的情况

实际上当前堆栈.里压入的是执行完MyFunction()后的返回地址,
也就是第18行代码的地址002D2B00

为了验证,转到寄存器窗口,学过汇编的都知道ESP指针指向的是当前栈顶

Ok,ESP = 06D6EC18, 转到内存处去查看下06D6EC18处是否保存着002D2B00

总结下:当前堆栈栈顶存储的是执行完当前函数后的返回地址.
现在开始进行最后一步,分析下函数里反汇编代码的功能
002D2CA0 push ebp           //前面这二句用来保存esp,         002D2CA1  mov         ebp,esp    //此时ebp指向栈顶,后面可以通过[ebp+xx]访问函数参数 002D2CA3  push        edi  002D2CA4  push        esi  002D2CA5  push        ebx           //对edi esi ebx寄存器压栈进行保存
//sub esp,2Ch 分配临时变量空间, 我们代码是个空函数,没有临时变量,
//这里的2Ch空间是供下面VS添加的代码使用的
//这下面是一堆是VS生成的debug代码, release代码就不一样了
002D2CA6  sub         esp,2Ch     002D2CA9  xor         ebx,ebx       002D2CAB  mov         dword ptr [ebp-10h],ebx  002D2CAE  mov         dword ptr [ebp-1Ch],ebx  002D2CB1  cmp         dword ptr ds:[0015C7A8h],0  002D2CB8  je          002D2CBF  002D2CBA  call        71C6CB2D  002D2CBF  nop
//这后面的代码是当前函数返回时必须要做的堆栈平衡处理
002D2CC0 nop 002D2CC1  lea         esp,[ebp-0Ch]   //让esp指向函数入口处的栈顶
//下面就是依次把入口处后保存的三个寄存器依次从栈中弹出002D2CC4  pop         ebx            002D2CC5  pop         esi  002D2CC6  pop         edi  002D2CC7  pop         ebp 
//ret 把栈顶的返回地址弹出,改变eip,让当前CPU跳转到Main函数中语句MyFunction()下一句代码的地址
002D2CC8  ret  
未完待续,后面还有第二篇有返回值有参数的函数分析

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C#.NET频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved