分析下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#中的函数(一) 无参无返回值的函数的更多相关文章

  1. C#中的函数(二) 有参有返回值的函数

    接上一篇 C#中的函数(-) 无参无返回值的函数 http://www.cnblogs.com/fzxiaoyi/p/8502613.html 这次研究下C#中的函数(二) 有参有返回值的函数 依然写 ...

  2. 慕课网-Java入门第一季-7-3 Java 中无参带返回值方法的使用

    来源:http://www.imooc.com/code/1579 如果方法不包含参数,但有返回值,我们称为无参带返回值的方法. 例如:下面的代码,定义了一个方法名为 calSum ,无参数,但返回值 ...

  3. Java 中无参带返回值方法的使用

    如果方法不包含参数,但有返回值,我们称为无参带返回值的方法. 例如:下面的代码,定义了一个方法名为 calSum ,无参数,但返回值为 int 类型的方法,执行的操作为计算两数之和,并返回结果 在 c ...

  4. 064 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 无参带返回值方法

    064 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 无参带返回值方法 本文知识点:无参带返回值方法 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...

  5. C++ //纯虚函数和抽象类 // 语法 virtual 返回值类型 函数名 (参数列表)=0 //当类中有了纯虚函数 这个类也称为抽象类

    1 //纯虚函数和抽象类 2 // 语法 virtual 返回值类型 函数名 (参数列表)=0 3 //当类中有了纯虚函数 这个类也称为抽象类 4 5 6 #include <iostream& ...

  6. Swift2.0语言教程之函数的返回值与函数类型

    Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有 ...

  7. 慕课网-Java入门第一季-7-2 Java 中无参无返回值方法的使用

    来源:http://www.imooc.com/code/1578 如果方法不包含参数,且没有返回值,我们称为无参无返回值的方法. 方法的使用分两步: 第一步,定义方法 例如:下面代码定义了一个方法名 ...

  8. Java 中无参无返回值方法的使用

    如果方法不包含参数,且没有返回值,我们称为无参无返回值的方法. 方法的使用分两步: 第一步,定义方法 例如:下面代码定义了一个方法名为 show ,没有参数,且没有返回值的方法,执行的操作为输出 “ ...

  9. ForkJoin有参无返回值、有参有返回值实例

    介绍: a . Fork/Join为JKD1.7引入,适用于对大量数据进行拆分成多个小任务进行计算的框架,最后把所有小任务的结果汇总合并得到最终的结果 b . 相关类 public abstract ...

  10. 063 01 Android 零基础入门 01 Java基础语法 08 Java方法 01 无参无返回值方法

    063 01 Android 零基础入门 01 Java基础语法 08 Java方法 01 无参无返回值方法 本文知识点:无参无返回值方法 无参无返回值方法 案例 为什么使用方法?--方便复杂问题调用 ...

随机推荐

  1. jquery.pagination.js的使用

    html页面 //要显示内容表格 <table id="gifts"> <tr class='first'> <th>时间</th> ...

  2. Python 爬取 13 个旅游城市,告诉你五一大家最爱去哪玩?

    五一假期已经结束,小伙伴是不是都还没有玩过瘾?但是没办法,还有很多bug等着我们去写,同样还有需要money需要我们去赚.为了生活总的拼搏. 今年五一放了四天假,很多人不再只是选择周边游,因为时间充裕 ...

  3. snowflake ID生成器

    背景 Snowflake 是 Twitter 内部的一个 ID 生算法, 可以通过一些简单的规则保证在大规模分布式情况下生成唯一的 ID 号码. 其组成为: 第一个 bit 为未使用的符号位. 第二部 ...

  4. [数据分析]利用pandasticsearch批量读取ES

    1.git地址 https://github.com/onesuper/pandasticsearch 2.建立连接 from pandasticsearch import DataFrame use ...

  5. Vue.js 源码分析(十二) 基础篇 组件详解

    组件是可复用的Vue实例,一个组件本质上是一个拥有预定义选项的一个Vue实例,组件和组件之间通过一些属性进行联系. 组件有两种注册方式,分别是全局注册和局部注册,前者通过Vue.component() ...

  6. Skywalking总结

    步骤四,完善Agent:你会发现,你在skywalking的Web监控页面看到的项目名称并非你原有的项目名称,而是一个默认的—— Your_ApplicationName.这是因为你还没有配置.打开/ ...

  7. Spring Boot 一个依赖搞定 session 共享,没有比这更简单的方案了!

    有的人可能会觉得题目有点夸张,其实不夸张,题目没有使用任何修辞手法!认真读完本文,你就知道松哥说的是对的了! 在传统的单服务架构中,一般来说,只有一个服务器,那么不存在 Session 共享问题,但是 ...

  8. 大数据Excel导出方案

    static void Main(string[] args) { Excel.Application app = new Excel.Application(); Excel._Workbook r ...

  9. 【转】Visual Studio Code(VS code)你们都在用吗?或许你们需要看一下这篇博文

    写在前面 在前端开发中,有一个非常好用的工具,Visual Studio Code,简称VS code. 都不用我安利VS code,大家就会乖乖的去用,无数个大言不惭的攻城狮,都被VS code比德 ...

  10. Asp.NetCoreWebApi - RESTful Api

    目录 参考文章 REST 常用http动词 WebApi 在 Asp.NetCore 中的实现 创建WebApi项目. 集成Entity Framework Core操作Mysql 安装相关的包(为X ...