首页 > 其他分享 >函数调用过程分析

函数调用过程分析

时间:2024-05-04 21:11:52浏览次数:20  
标签:分析 __ 调用 调用者 int 约定 函数调用 参数 过程

参考:轩辕之风——从0开始学逆向第7天

函数调用约定

定义

在计算机科学中,调用约定是一种定义子过程从调用处接受参数以及返回结果的方法的约定。
不同调用约定的区别在于: 参数和返回值放置的位置、参数传递的顺序、调用前设置和调用后清理的工作,在调用者和被调用者之间如何分配,被调用者可以直接使用哪一个寄存器有时也包括在内。——维基百科

简单理解:main函数内调用func1函数,他们之间的参数、返回值如何传递,进行提前约定。
image.png

3种约定类型

image.png
不同点:

  1. 参数使用栈传递 OR 寄存器传递
  2. 调用者 OR 被调用者负责释放参数空间

使用在线反编译工具分析调用过程。https://godbolt.org/
选择x86 msvc v19.latest编译方式。

如何约定调用方式?
在被调用函数之前声明约定类型关键字即可。

int 调用方式 func(int a,int b){
    int sum = a+b;
    return sum;
}

int main(){
    int a=1,b=2;
    int c = func(a,b);
    return 0;
}

__cdecl调用方式

func子函数
image.png
main主函数
image.png
参数使用栈传递,调用者负责释放参数空间。

__stdcall调用方式

image.png
image.png
参数使用栈传递,被调用者负责释放参数空间。
__stdcall 调用约定中,子函数通过 __cdecl 调用约定返回 8,这相当于在 __cdecl 调用约定中主函数的
add esp, 8 指令

__fastcall调用方式

int __fastcall func(int a,int b,int c){
    int sum = a+b+c;
    return sum;
}

int main(){
    int a=1,b=2,c=3;
    int d = func(a,b,c);
    return 0;
}

主函数main,这里func(a,b,c)的传参,前两个参数ab使用寄存器,而第三个参数c使用栈传递。
image.png
子函数func
image.png
参数使用寄存器(可能含栈)传递,被调用者负责释放参数空间。可以预见,这里使用栈传递的参数依然符合从右到左的传参方式。
image.png
通过以上__fastcall的汇编调用还可以看出。参数使用栈传递时,由调用函数在栈中开辟一段新空间,用于储存待传递的参数,子函数从这个主函数栈里面取值。而前两个参数使用寄存器传递时,又在子函数栈中开辟新空间,从寄存器中取值放到栈中,需要的时候再从子函数栈中取。

practice

1、请分析下面这段代码使用fastcall调用约定时是如何工作的:
int fun1(int a, int b, int c, int d) {
    return a*a + b*b + 2*a*b + c + d;
}
int main() {
    int c = fun1(3, 4, 5, 6);
    return 0;
}
  1. fastcall调用,fun1(3, 4) 参数放入寄存器,fun1(5, 6) 放入push入栈
  2. 进入call调用,ip入栈(保存函数调用前位置),子函数申请一段内存存放中间运算结果
  3. 最后return 申请的空间大小进行释放空间

image.png
image.png

标签:分析,__,调用,调用者,int,约定,函数调用,参数,过程
From: https://www.cnblogs.com/Rainy-Day/p/18172700

相关文章

  • Teamcenter AWC 调用存储过程输出报表
    1.前端:1.1增加导出报表命令:{  "commands":{   ...,    "ExportBOMCommand":{      "iconId":"cmdZoomToSelected",      "title":"{{i18n.ExportBOMCommandTitle}}",      &quo......
  • 【安卓逆向】MotionNinja会员功能的解锁分析
    这次的要分析的软件是......
  • 【c语言】编译过程详解
    为什么我们编写的C语言要进行编译❓什么是编译❓编译时发生了什么❓机器无法理解我们编写的C语言,而编译就是将面向人类的高级语言转换成为面向机器的机器语言的过程,图1是GCC编译器进行编译的过程,编译时主要分为了4个阶段,每个阶段的具体作用将在接下来进行介绍。图1......
  • 《软件性能测试、分析与调优实践之路》(第2版) PPT课件流出
    扫描图书前言中的如下图所示的二维码,即可进入到下载页面。 如下图所示即为课件的下载页面,免费提供下载   ......
  • 【Netty】【XXL-JOB】时间轮的原理以及应用分析
    1 前言今天晚上看了一本70多页的讲解时间轮的PDF,从是什么为什么以及原理到源码中的应用分析,讲的真好。这节我就按我理解的思路捋一下,记录一下哈。2 时间轮概述2.1 时间轮是什么时间轮是一种高效利用线程资源进行批量化调度的一种调度模型。把大批量的调度任务全部绑......
  • Hydro OJ搭建全过程
    第一步:注册服务器如果你和我一样,是一名新手党,想先免费调试自己的站点,那我教你免费申请一个服务器。在这里安利一下阿贝云,一个免费的云服务器和免费的云虚拟主机提供方,对于新手党来说确实不错。注册完一个账户以后,你需要支付0.3元做一个实名认证,如果实名认证成功了大概率会开......
  • 《操作系统》分析与总结
    通过这段时间对《操作系统》的学习,我有了很多感受,首先操作系统是计算机系统中最基本的系统软件之一。操作系统的主要功能包括进程管理、内存管理、文件系统管理和设备管理。现代操作系统已经具备了强大的功能和稳定性,为计算机用户提供了便利的操作环境。首先,操作系统中有内存管理......
  • NSSCTF流量分析
    1.[BSidesSF-CTF2019]Zippync-l-p4445>flag.zipunzip-Psupercomplexpasswordflag.zipArchive:flag.zipinflating:flag.txtPK.... ...NdbN..,.%...........flag.txtUT ....z\..z\ux...............(.y..z....F.......:...#Bz..:......
  • 第6讲需求分析--uml用例图
    用例图一.识别参与者参与者在系统外所以画图时画在框外。系统用例图比业务用例图更完善所以经常让画的是系统用例图。在商品销售系统里:参与者是顾客。在会计系统里:参与者是商品销售系统。二.关系1.参与者之间泛化关系子指向父2.参与者和用例之间关联关系3.用例和用......
  • 优先级翻转实验以及分析现象
    优先级翻转实验以及分析现象优先级翻转指的是高优先级的任务反而慢执行,低优先级的任务反而优先执行。优先级翻转在抢占式内核中是非常常见的,但是在实时操作系统中是不允许出现优先级翻转的,因为优先级翻转会破坏任务的预期顺序,可能会导致未知的严重后果。上图中三个任务的优先级......