【汇编和c语言】空函数和裸函数和调用约定
c语言里面有个东西叫函数
辣么~
你们看下以下这个函数,它干了什么?
嗯~看起来是一个空函数,什么都没干!
对于c语言来说,因为函数里面什么程序都没有,所以什么都没有执行,所以称之为空函数
!然 而!
它真的什么都没干吗?未必。
程序是什么都没干,但是编译器却干了很多事情!!!
我们来看下这个空函数的反汇编
可以看到,即使我们只是写了一个空函数,但是编译器还是为我们在暗地里做了很多手脚
做了什么事情?
开辟内存空间!!!
由此可知:每个程序运行都是需要占用内存的,就算程序没有用到,编译器也会自动开辟一块地方给函数,当程序执行完成之后再释放内存,留给下一个程序继续使用。
————————————————————————————————————————
辣么
如果我们不想让编译器自动为我们开辟空间,那要怎么办呢?
↓↓↓↓↓↓↓↓在这里有一个东西可以使用↓↓↓↓↓↓↓↓
裸函数
如图上所示,按照以上规定的格式书写函数,函数将变成一个裸函数
意思是告诉编译器,这个函数不进行任何操作,不能添加任何代码!!
↓↓↓↓↓↓↓所以我们看到的反汇编是这个样子的↓↓↓↓↓↓↓
真正意义上的空函数,比空函数还空的函数
但是这样可以运行起来吗?
可以看到,即使编译器没有报错,但是程序却直接崩溃了
为什么?
为什么?
为什么?
因为裸函数里面什么都没有,所以里面的堆栈无法平衡,所以程序奔溃了
那要怎么办呢?
因为裸函数里面什么都没有,所以之前编译器为我们做的东西,现在我们要自己动手做
怎么做?
↓↓↓↓↓↓↓按照以下的格式↓↓↓↓↓↓↓
在__asm这个函数里面自行添加汇编的指令,使得堆栈平衡,就可以通过啦~
如此,编译成功!
最后!附上一个调用约定,具体怎么使用得可以看着说明自己操作一下下~
【汇编和c语言】空函数和裸函数和调用约定相关推荐
- 裸函数 __declspec(naked),C语言是怎么变成汇编的,用裸函数加汇编实现一个最简单的加法函数
裸函数: 普通函数会自动生成实现堆栈提升.堆栈的缓存区建立.堆栈平衡和函数返回的汇编代码,裸函数不会自动生成任何代码,全部要自己手动写汇编代码. 裸函数定义:__declspec(naked) 加汇编 ...
- C/C++/动态链接库DLL中函数的调用约定与名称修饰
参见:http://blog.twofei.com/cc/impl/calling-convension.html 调用约定(Calling Convention)是指在程序设计语言中为了实现函数调用 ...
- [汇编与C语言关系]2. main函数与启动例程
为什么汇编程序的入口是_start,而C程序的入口是main函数呢?以下就来解释这个问题 在<x86汇编程序基础(AT&T语法)>一文中我们汇编和链接的步骤是: $ as hell ...
- 【C 语言】字符串模型 ( 字符串翻转模型 | 抽象成业务函数 | 形参返回值 | 函数返回值 | 函数形参处理 | 形参指针判空 )
文章目录 一.字符串翻转模型 业务函数 二.完整代码示例 一.字符串翻转模型 业务函数 将上一篇博客 [C 语言]字符串模型 ( 字符串翻转模型 ) 的代码 , 主要业务逻辑 , 抽象成函数 ; 字符 ...
- C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质...
C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质 事情的经过是这种,博主在用C写一个简单的业务时使用递归,因为粗心而忘了写return.结果发现返回的结 ...
- c语言裸函数,【逆向知识】裸函数(Naked函数)
1 说明 指定裸函数编写的函数,编译器生成不带任何多余代码. 利用此功能,可以使用内联汇编程序代码编写自己的 prolog/epilog 代码序列. 裸函数对于编写虚拟设备驱动程序特别有用. 2 练习 ...
- 汇编和c语言函数的参数,C函数与汇编函数之间参数及返回值传递方法
AAPCS对ARM结构的一些标准做了定义,在这里我们只重点介绍函数调用部分,如图8所示,AAPCS为ARM的R0~R15寄存器做了定义,明确了它们在函数中的职责: 图 8 AAPCS关于ARM寄存器的 ...
- vc 编译c语言时出错,在vc++里输入c语言空函数,为什么编译没错,连接出错?
在vc++里输入c语言空函数,为什么编译没错,连接出错? 來源:互聯網 2010-02-14 09:24:33 評論 分類: 電腦/網絡 >> 程序設計 >> 其他編程語言 ...
- 【Win32汇编】__declspec(naked)裸函数
使用 __declspec(naked) 定义的函数,编译器只会负责参数压栈.执行CALL指令,和释放参数的内存(堆栈平衡),除此之外啥也没有,比如提升堆栈,寄存器的保存和恢复,或者是函数返回,这些都 ...
最新文章
- Window Server 2008 R2系统备份
- MySQL如何存储Emoji表情,UTF-8和UTF-8MB4字符编码有何区别
- liferay 点击build service 出现Cloud not reserve enough space for object heap
- 微软腾讯京东都在高薪招.NET Core,你准备好了吗!
- 在.NET Core中处理一个接口多个不同实现的依赖注入问题
- 21秋期末考试财务会计(二)10165k2
- 浅谈:飞鸽传书 的TCP/IP原理
- 无连接可靠传输_FPC连接器的特点以及弹片微针模组的作用
- cygwin boost
- 人工智能3d建模算法_黑科技 | 3D人脸建模可以多简单?一张照片就搞定!
- mysql中哪一个储存逻辑型_《VisualFoxPro》2018秋华东年季学期在线作业(一)二三...
- Java 开发项目管理工具
- unity导入Standard Assets出现错误
- Java学习笔记(五):Complex类的设计及加减乘除运算的实现
- 显示器尺寸 和 屏幕分辨率 和 有源信号分辨率 关系
- Bumped!(dijskra)
- Ubuntu 自带截图工具快捷键盘
- pta 计算机通信(并查集)
- 最受程序员欢迎的 20 本书!
- 拼多多崛起背后的电商新版图