(六)羽夏看C语言——函数
写在前面
由于此系列是本人一个字一个字码出来的,包括示例和实验截图。本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正。 如有好的建议,欢迎反馈。码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作。如想转载,请把我的转载信息附在文章后面,并声明我的个人信息和本人博客地址即可,但必须事先通知我。
你如果是从中间插过来看的,请仔细阅读(一)羽夏看C语言——简述 ,方便学习本教程。
前篇答疑解惑
答案:不会。
解答:我相信亲手做实验的人都会知道的。
函数
一个程序必须有一个函数,比如C语言中的main函数,也可以实现别的函数实现功能。本篇文章将从汇编的角度介绍函数,本次实验的代码十分简单。为了防止干扰,请在项目属性中关闭增量链接和支持仅我的代码调试(具体作用请搜索科普,它们会生成一些汇编代码来实现相应的功能)。
int main()
{
int a = 5;
return 0;
}
得到的反汇编如下:

通过汇编可以看出,函数生成的汇编采用ebp寻址的方式。前三句汇编进行用ebp寻址的准备和提栈准备缓冲区的操作,提供的缓冲区用来给函数内的局部变量用的。
有些生成的反汇编可能是这样的版本:
push ebp
mov ebp,esp
sub esp,0x40
push ebx
push esi
push edi
lea edi,[ebp-0x40]
mov ecx,0x10
mov eax,0xcccccccc
rep stosd
mov dword ptr [ebp-8],5
xor eax,eax
pop edi
pop esi
pop ebx
mov esp,ebp
pop ebp
ret
有些人可能看不懂以下代码:
lea edi,[ebp-0x40]
mov ecx,0x10
mov eax,0xcccccccc
rep stosd
上面的代码是将0xCC填充满整个缓冲区,可帮助检测到堆栈缓冲区溢出,这是一种常见的攻击,威胁程序的安全性。0xCC即为我们调试的普通断点,汇编为int 3,即VS按下F9下断点(代码行左边的小红点)。
函数调用
int test(int a, int b)
{
return a + b;
}
int main()
{
int a = test(1, 2);
return 0;
}
然后看一下反汇编:


可以看出函数调用时会通过push传递参数,然后call一个地址跳转到test函数,通过eax作为返回值。调用完毕后用add esp,8平栈,这个所谓的一种调用约定,被称为__cdecl。当然调用约定不知这一种,你也可以自定义,不过得从汇编上实现。
调用约定
当一个函数被调用时,函数的参数会被传递给被调用的函数和返回值会被返回给调用函数。函数的调用约定就是描述参数是怎么传递和返回值,由谁平衡堆栈,这就是所谓的调用约定。
我们先给出常见的调用约定,其他的调用约定自行科普:
| 调用约定 | __stdcall | __cdecl | __fastcall | __pascal |
|---|---|---|---|---|
| 参数传递顺序 | 从右到左 | 从左到右 | 从右到左 | 使用寄存器和栈 |
| 平栈 | 调用者 | 子程序 | 子程序 | 子程序 |
当然,在IDA中你可能会看到其他调用约定,比如__thiscall等。由于调用约定并不是我想重点讲述的,具体细节自行科普。C语言默认的调用约定为__cdecl,所以在 函数调用 部分已有示例。这部分就用__fastcall做个为调用约定示例。
int __fastcall test(int a, int b)
{
return a + b;
}
int main()
{
int a = test(1, 2);
return 0;
}
如下是反汇编:

下一篇
(七)羽夏看C语言——模板(C++)
(六)羽夏看C语言——函数的更多相关文章
- (五)羽夏看C语言——结构体与类
写在前面 由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...
- (二)羽夏看C语言——容器
写在前面 由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...
- (七)羽夏看C语言——模板(C++)
写在前面 由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...
- (八)羽夏看C语言——C番外篇
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...
- (九)羽夏看C语言——C++番外篇
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...
- (四)羽夏看C语言——循环与跳转
写在前面 由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...
- (三)羽夏看C语言——进制
写在前面 由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...
- (一)羽夏看C语言——简述
"羽夏看C语言"介绍什么 本系列从汇编的角度,比较翔实的介绍C语言.C++和C其实是一样的东西,C++的编译器只是更强大,更能帮助我们写代码,例如模板.没有特殊说明,本系列不会 ...
- 羽夏看Win系统内核——简述
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
随机推荐
- 原来select语句在MySQL中是这样执行的!看完又涨见识了!这回我要碾压面试官!
大家好,我是冰河~~ MySQL作为互联网行业使用最多的关系型数据库之一,与其免费.开源的特性是密不可分的.然而,很多小伙伴工作了很多年,只知道使用MySQL进行CRUD操作,这也导致很多小伙伴工作多 ...
- ffmpeg 任意文件读取漏洞/SSRF漏洞 (CVE-2016-1897/CVE-2016-1898)
影响版本 在FFMpeg2.X poc http://192.168.49.2:8000/?name={%25%20for%20c%20in%20[].__class__.__base__.__sub ...
- VSCode远程免密登录
VSCode远程免密登录 本地生成密钥 生成命令如下: ssh-keygen -t rsa 会生成id_rsa, id_rsa.pub两个文件 公钥拷贝到服务器 将公钥id_rsa.pub拷贝到服务器 ...
- 什么是 RFC 2544
什么是 RFC 2544? 如果您从事网络工作,您可能听说过它,但 RFC 2544 究竟是什么呢? RFC 的全称是 Request for comment ,请求注解.是一系列收录了互联网国际标准 ...
- 虚拟机中桥接模式和NAT模式以及仅主机模式的区别
桥接模式和NAT模式 网络连接类型的选择,网络连接类型一共有桥接.NAT.仅主机和不联网四种. 桥接:选择桥接模式的话虚拟机和宿主机在网络上就是平级的关系,相当于连接在同一交换机上. NAT:NAT模 ...
- 我把阿里、腾讯、字节跳动、美团等Android性能优化实战整合成了一个PDF文档
安卓开发大军浩浩荡荡,经过近十年的发展,Android技术优化日异月新,如今Android 11.0 已经发布,Android系统性能也已经非常流畅,可以在体验上完全媲美iOS. 但是,到了各大厂商手 ...
- Vue响应式原理底层代码模拟实现
整体分析Vue的基本结构如下图所示:(备注:完整代码github地址https://github.com/1512955040/MiniVue) 上图中,为我们模拟最小vue的整体结构,首先创建一个v ...
- 十进制转十六进制 BASIC-10
十进制转十六进制 import java.util.Scanner; public class 十进制转十六进制 { /* 十六进制数是在程序设计时经常要使用到的一种整数的表示方式. * 它有0,1, ...
- 十分钟带你了解CANN应用开发全流程
摘要:CANN作为昇腾AI处理器的发动机,支持业界多种主流的AI框架,包括MindSpore.TensorFlow.Pytorch.Caffe等,并提供1200多个基础算子. 2021年7月8日,第四 ...
- 寻找写代码感觉(一)之使用 Spring Boot 快速搭建项目
写在前面 现在已经是八月份了,我已经荒废了半年居多,不得不说谈恋爱确实是个麻烦的事,谈好了皆大欢喜,分手了就是萎靡不振,需要很长一段时间才能缓过来. 人还是要有梦想的,至于实现只不过是一个契机,但凡不 ...