c语言里面有个东西叫函数

辣么~

你们看下以下这个函数,它干了什么?

嗯~看起来是一个空函数,什么都没干!

对于c语言来说,因为函数里面什么程序都没有,所以什么都没有执行,所以称之为空函数

!然 而!

它真的什么都没干吗?未必。

程序是什么都没干,但是编译器却干了很多事情!!!

我们来看下这个空函数的反汇编

可以看到,即使我们只是写了一个空函数,但是编译器还是为我们在暗地里做了很多手脚

做了什么事情?

开辟内存空间!!!

由此可知:每个程序运行都是需要占用内存的,就算程序没有用到,编译器也会自动开辟一块地方给函数,当程序执行完成之后再释放内存,留给下一个程序继续使用。

————————————————————————————————————————

辣么

如果我们不想让编译器自动为我们开辟空间,那要怎么办呢?

↓↓↓↓↓↓↓↓在这里有一个东西可以使用↓↓↓↓↓↓↓↓

裸函数

如图上所示,按照以上规定的格式书写函数,函数将变成一个裸函数

意思是告诉编译器,这个函数不进行任何操作,不能添加任何代码!!

↓↓↓↓↓↓↓所以我们看到的反汇编是这个样子的↓↓↓↓↓↓↓

真正意义上的空函数,比空函数还空的函数

但是这样可以运行起来吗?

可以看到,即使编译器没有报错,但是程序却直接崩溃了

为什么?

为什么?

为什么?

因为裸函数里面什么都没有,所以里面的堆栈无法平衡,所以程序奔溃了

那要怎么办呢?

因为裸函数里面什么都没有,所以之前编译器为我们做的东西,现在我们要自己动手做

怎么做?

↓↓↓↓↓↓↓按照以下的格式↓↓↓↓↓↓↓

在__asm这个函数里面自行添加汇编的指令,使得堆栈平衡,就可以通过啦~

如此,编译成功!

最后!附上一个调用约定,具体怎么使用得可以看着说明自己操作一下下~

【汇编和c语言】空函数和裸函数和调用约定相关推荐

  1. 裸函数 __declspec(naked),C语言是怎么变成汇编的,用裸函数加汇编实现一个最简单的加法函数

    裸函数: 普通函数会自动生成实现堆栈提升.堆栈的缓存区建立.堆栈平衡和函数返回的汇编代码,裸函数不会自动生成任何代码,全部要自己手动写汇编代码. 裸函数定义:__declspec(naked) 加汇编 ...

  2. C/C++/动态链接库DLL中函数的调用约定与名称修饰

    参见:http://blog.twofei.com/cc/impl/calling-convension.html 调用约定(Calling Convention)是指在程序设计语言中为了实现函数调用 ...

  3. [汇编与C语言关系]2. main函数与启动例程

    为什么汇编程序的入口是_start,而C程序的入口是main函数呢?以下就来解释这个问题 在<x86汇编程序基础(AT&T语法)>一文中我们汇编和链接的步骤是: $ as hell ...

  4. 【C 语言】字符串模型 ( 字符串翻转模型 | 抽象成业务函数 | 形参返回值 | 函数返回值 | 函数形参处理 | 形参指针判空 )

    文章目录 一.字符串翻转模型 业务函数 二.完整代码示例 一.字符串翻转模型 业务函数 将上一篇博客 [C 语言]字符串模型 ( 字符串翻转模型 ) 的代码 , 主要业务逻辑 , 抽象成函数 ; 字符 ...

  5. C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质...

    C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质 事情的经过是这种,博主在用C写一个简单的业务时使用递归,因为粗心而忘了写return.结果发现返回的结 ...

  6. c语言裸函数,【逆向知识】裸函数(Naked函数)

    1 说明 指定裸函数编写的函数,编译器生成不带任何多余代码. 利用此功能,可以使用内联汇编程序代码编写自己的 prolog/epilog 代码序列. 裸函数对于编写虚拟设备驱动程序特别有用. 2 练习 ...

  7. 汇编和c语言函数的参数,C函数与汇编函数之间参数及返回值传递方法

    AAPCS对ARM结构的一些标准做了定义,在这里我们只重点介绍函数调用部分,如图8所示,AAPCS为ARM的R0~R15寄存器做了定义,明确了它们在函数中的职责: 图 8 AAPCS关于ARM寄存器的 ...

  8. vc 编译c语言时出错,在vc++里输入c语言空函数,为什么编译没错,连接出错?

    在vc++里输入c语言空函数,为什么编译没错,连接出错? 來源:互聯網  2010-02-14 09:24:33  評論 分類: 電腦/網絡 >> 程序設計 >> 其他編程語言 ...

  9. 【Win32汇编】__declspec(naked)裸函数

    使用 __declspec(naked) 定义的函数,编译器只会负责参数压栈.执行CALL指令,和释放参数的内存(堆栈平衡),除此之外啥也没有,比如提升堆栈,寄存器的保存和恢复,或者是函数返回,这些都 ...

最新文章

  1. Window Server 2008 R2系统备份
  2. MySQL如何存储Emoji表情,UTF-8和UTF-8MB4字符编码有何区别
  3. liferay 点击build service 出现Cloud not reserve enough space for object heap
  4. 微软腾讯京东都在高薪招.NET Core,你准备好了吗!
  5. 在.NET Core中处理一个接口多个不同实现的依赖注入问题
  6. 21秋期末考试财务会计(二)10165k2
  7. 浅谈:飞鸽传书 的TCP/IP原理
  8. 无连接可靠传输_FPC连接器的特点以及弹片微针模组的作用
  9. cygwin boost
  10. 人工智能3d建模算法_黑科技 | 3D人脸建模可以多简单?一张照片就搞定!
  11. mysql中哪一个储存逻辑型_《VisualFoxPro》2018秋华东年季学期在线作业(一)二三...
  12. Java 开发项目管理工具
  13. unity导入Standard Assets出现错误
  14. Java学习笔记(五):Complex类的设计及加减乘除运算的实现
  15. 显示器尺寸 和 屏幕分辨率 和 有源信号分辨率 关系
  16. Bumped!(dijskra)
  17. Ubuntu 自带截图工具快捷键盘
  18. pta 计算机通信(并查集)
  19. 最受程序员欢迎的 20 本书!
  20. 拼多多崛起背后的电商新版图

热门文章

  1. CSS样式关键字initial、inherit、unset、revert和all
  2. 域名国家工程研究中心(ZDNS)培训认证中心正式成立
  3. 【数仓设计】宽表和窄表
  4. matlab求解零输入响应,基于matlab的零输入和零状态响应
  5. 马斯洛需求层次与产品的关系
  6. 2008北京奥运会足球赛程(男足)
  7. SQLServer中的N是什么意思?
  8. 柳传志内部邮件曝光:联想筹备1年等待大反攻
  9. C语言单分支if语句形式,2 单分支if语句
  10. 1.【Linux】如何在Ubuntu18.04上安装微信