写在前面

  由于此系列是本人一个字一个字码出来的,包括示例和实验截图。本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正。 如有好的建议,欢迎反馈。码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作。如想转载,请把我的转载信息附在文章后面,并声明我的个人信息和本人博客地址即可,但必须事先通知我。

你如果是从中间插过来看的,请仔细阅读(一)羽夏看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语言——函数的更多相关文章

  1. (五)羽夏看C语言——结构体与类

    写在前面   由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...

  2. (二)羽夏看C语言——容器

    写在前面   由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...

  3. (七)羽夏看C语言——模板(C++)

    写在前面   由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...

  4. (八)羽夏看C语言——C番外篇

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

  5. (九)羽夏看C语言——C++番外篇

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

  6. (四)羽夏看C语言——循环与跳转

    写在前面   由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...

  7. (三)羽夏看C语言——进制

    写在前面   由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...

  8. (一)羽夏看C语言——简述

    "羽夏看C语言"介绍什么   本系列从汇编的角度,比较翔实的介绍C语言.C++和C其实是一样的东西,C++的编译器只是更强大,更能帮助我们写代码,例如模板.没有特殊说明,本系列不会 ...

  9. 羽夏看Win系统内核——简述

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

随机推荐

  1. Wordpress 4.6 任意命令执行漏洞(PwnScriptum)

    漏洞存在后台登录地方的找回密码页面:http://192.168.49.2:8080/wp-login.php?action=lostpassword 抓包进行修改包 输入一个存在的用户,然后点击获取 ...

  2. Netty 源码分析系列(一)Netty 概述

    前言 关于Netty的学习,最近看了不少有关视频和书籍,也收获不少,希望把我知道的分享给你们,一起加油,一起成长.前面我们对 Java IO.BIO.NIO. AIO进行了分析,相关文章链接如下: 深 ...

  3. 缩减Azure上Linux虚拟机系统盘容量

    [话在前头] 这么些年微软 Azure 创建虚拟机一直不能修改系统盘大小,但很多时候实际又用不了这么大的操作系统磁盘.微软自己甚至还针对 Windows 服务器镜像推出一个 smalldisk 的镜像 ...

  4. CentOS 永久修改系统时间

    1.查看当前系统时间 date       2.修改当前系统时间 date -s "2018-2-22 19:10:30       3.查看硬件时间 hwclock --show      ...

  5. BurpSuite 2020.5安装教程

    Burpsuite2020.5安装教程 Burpsuite2020.5需要在Java11的环境下才可正常运行. 所以首先安装Java11: 安装Java11 Java SE的安装非常简单,直接下一步, ...

  6. Create Virtual Network with VirtualBox on Mint 14

    VirtualBox version: VirtualBox-4.2.18-88780-Linux_x86.run Host OS: Linux Mint 14 Xfce Setup Network ...

  7. 课程设计-基于SSM的美容美发造型预约管理系统代码Java理发剪发设计造型系统vue美发店管理系统

    注意:该项目只展示部分功能,如需了解,评论区咨询即可. 1.开发环境 开发语言:Java 后台框架:SSM 前端框架:vue 数据库:MySQL 设计模式:MVC 架构:B/S 源码类型: Web 编 ...

  8. miniFTP项目实战三

    项目简介: 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务 ...

  9. Linux、Windows 下手动生成 sha256 等类型的校验文件

    目录 1 - 校验文件的作用 2 - Linux 下生成校验文件 3 - Windows 下生成校验文件 参考资料 版权声明 1 - 校验文件的作用 从网服务器下载文件,尤其是比较大的文件时,很容易由 ...

  10. Java实现WebSocket服务

    一.使用Tomcat提供的WebSocket库  Java可以使用Tomcat提供的WebSocket库接口实现WebSocket服务,代码编写也非常的简单.现在的H5联网游戏基本上都是使用WebSo ...