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#中的函数(一) 无参无返回值的函数的更多相关文章
- C#中的函数(二) 有参有返回值的函数
接上一篇 C#中的函数(-) 无参无返回值的函数 http://www.cnblogs.com/fzxiaoyi/p/8502613.html 这次研究下C#中的函数(二) 有参有返回值的函数 依然写 ...
- 慕课网-Java入门第一季-7-3 Java 中无参带返回值方法的使用
来源:http://www.imooc.com/code/1579 如果方法不包含参数,但有返回值,我们称为无参带返回值的方法. 例如:下面的代码,定义了一个方法名为 calSum ,无参数,但返回值 ...
- Java 中无参带返回值方法的使用
如果方法不包含参数,但有返回值,我们称为无参带返回值的方法. 例如:下面的代码,定义了一个方法名为 calSum ,无参数,但返回值为 int 类型的方法,执行的操作为计算两数之和,并返回结果 在 c ...
- 064 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 无参带返回值方法
064 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 无参带返回值方法 本文知识点:无参带返回值方法 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...
- C++ //纯虚函数和抽象类 // 语法 virtual 返回值类型 函数名 (参数列表)=0 //当类中有了纯虚函数 这个类也称为抽象类
1 //纯虚函数和抽象类 2 // 语法 virtual 返回值类型 函数名 (参数列表)=0 3 //当类中有了纯虚函数 这个类也称为抽象类 4 5 6 #include <iostream& ...
- Swift2.0语言教程之函数的返回值与函数类型
Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有 ...
- 慕课网-Java入门第一季-7-2 Java 中无参无返回值方法的使用
来源:http://www.imooc.com/code/1578 如果方法不包含参数,且没有返回值,我们称为无参无返回值的方法. 方法的使用分两步: 第一步,定义方法 例如:下面代码定义了一个方法名 ...
- Java 中无参无返回值方法的使用
如果方法不包含参数,且没有返回值,我们称为无参无返回值的方法. 方法的使用分两步: 第一步,定义方法 例如:下面代码定义了一个方法名为 show ,没有参数,且没有返回值的方法,执行的操作为输出 “ ...
- ForkJoin有参无返回值、有参有返回值实例
介绍: a . Fork/Join为JKD1.7引入,适用于对大量数据进行拆分成多个小任务进行计算的框架,最后把所有小任务的结果汇总合并得到最终的结果 b . 相关类 public abstract ...
- 063 01 Android 零基础入门 01 Java基础语法 08 Java方法 01 无参无返回值方法
063 01 Android 零基础入门 01 Java基础语法 08 Java方法 01 无参无返回值方法 本文知识点:无参无返回值方法 无参无返回值方法 案例 为什么使用方法?--方便复杂问题调用 ...
随机推荐
- [LeetCode] 923. 3Sum With Multiplicity 三数之和的多种情况
Given an integer array A, and an integer target, return the number of tuples i, j, k such that i &l ...
- 第01组 Beta冲刺(5/5)
队名:007 组长博客: https://www.cnblogs.com/Linrrui/p/12031875.html 作业博客: https://edu.cnblogs.com/campus/fz ...
- jenkins 更新插件使用代理
方法一: 管理插件页面配置如下: 这个 URL 改成http://mirror.xmission.com/jenkins/updates/update-center.json 或https://mir ...
- 好用的低延迟vps
ZeptoVM是一个俄罗斯的云提供商, 由于提供了黑龙江北边的机房, 所以延迟比较低 注意一定要选Khabarovsk节点, 这个节点延迟很低, 我在上海延迟大约有70ms 缺点就是比较贵, 按照年付 ...
- Vue官方文档笔记
1.如何创建一个Vue实例对象? var vm = new Vue({ el: "#app", //标签id 或 标签类名 data:{ //双向绑定的数据 message: &q ...
- no main manifest attribute, in testProject-1.0-SNAPSHOT.jar
no main manifest attribute, in testProject-1.0-SNAPSHOT.jar 错误描述: no main manifest attribute, in tes ...
- 【转】.Net程序员学习Linux最简单的方法
有很多关于Linux的书籍.博客.大多数都会比较“粗暴“的将一大堆的命令塞给读者,从而使很多.NET程序员望而却步.未入其门就路过了. 所以我设想用一种更为平滑的学习方式, 就是在学习命令时,先用纯语 ...
- Java学习之初识Maven
简介 功能特点 Maven主要作用类似于VS的包管理器,能够帮助开发者完成以下工作:构建.文档生成.报告.依赖.SCMs.发布.分发.邮件列表等. 详细请阅读:https://www.runoob.c ...
- 关于CSS特性和选择器
1层叠 样式冲突的遵循就近原则, 2继承 子代会继承父代的某些属性,例如字体大小,字体颜色 3优先级 !important 权重最高 通配符 * 和 继承的属性 权重为 0 0 0 0 行内样式权 ...
- .Net Core实战教程(二):设置Kestrel的IP与端口的几种方法
.Net Core实战教程(二):设置Kestrel的IP与端口的几种方法 1.直接写在代码方式 Program.cs代码如下: using System; using System.Collecti ...