`

函数调用的过程

 
阅读更多

C语言在函数调用的过程中的参数到底是怎么传递的,传值和传参数的差别在哪里,我从最简单的过程开始,让自己复习一下。

如果我们不采用方法调用,正常的计算过程是这样的。

int a = 9;
int b =8;
int c = a+b;

 其对应的汇编代码如下:

	int a = 9;
000913BE  mov         dword ptr [a],9  
	int b =8;
000913C5  mov         dword ptr [b],8  
	int c = a+b;
000913CC  mov         eax,dword ptr [a]  
000913CF  add         eax,dword ptr [b]  
000913D2  mov         dword ptr [c],eax 

 这个过程都非常简单,也很容易理解,计算的过程没有额外的开销。下面把a+b的过程封装成一个函数int add(int,int);

对应的汇编代码如下:

	int c = add(a,b);这个是调用前的准备工作,将参数从右到左压入堆栈
009617EC  mov         eax,dword ptr [b]  //将b压入堆栈
009617EF  push        eax  
009617F0  mov         ecx,dword ptr [a]  //将a压入堆栈
009617F3  push        ecx  
009617F4  call        add (09611D6h)   //调用add方法
009617F9  add         esp,8  
009617FC  mov         dword ptr [c],eax  

 

下面是add的方面内部的过程

009613A0  push        ebp  
009613A1  mov         ebp,esp  
009613A3  sub         esp,0C0h  
009613A9  push        ebx  
009613AA  push        esi  
009613AB  push        edi  
009613AC  lea         edi,[ebp-0C0h]  
009613B2  mov         ecx,30h  
009613B7  mov         eax,0CCCCCCCCh  
009613BC  rep stos    dword ptr es:[edi] 

 

	return a+b;
009613BE  mov         eax,dword ptr [a]  
009613C1  add         eax,dword ptr [b]  

 

 

 

分享到:
评论

相关推荐

    C++函数调用过程深入分析

    函数调用的过程实际上也就是一个中断的过程,那么C++中到底是怎样实现一个函数的调用的呢?参数入栈、函数跳转、保护现场、回复现场等又是怎样实现的呢?本文将对函数调用的过程进行深入的分析和详细解释,并在VC ...

    read()函数调用过程剖析

    "read()函数调用过程剖析" 本文详细介绍了read()函数在Linux系统中调用过程,从用户层到文件系统层、通用块层、page cache层、驱动层到设备层的过程。 一、read()函数调用过程 read()函数调用过程可以分为两个...

    函数调用过程种种细节分析

    本文将深入探讨函数调用过程中涉及的关键概念:堆栈帧、函数调用和堆栈切换。 首先,我们要理解堆栈帧(Stack Frame)。在计算机科学中,堆栈是一种特殊的内存区域,遵循“后进先出”(LIFO)原则。每当一个函数被...

    函数调用过程深入分析

    在深入分析C++函数调用过程之前,我们需要了解一些基础概念和术语。在函数调用中,CPU执行的是一个由call指令引导的过程,这本质上是程序执行流程的一个中断和转移。函数调用过程涉及到的几个关键步骤包括参数入栈、...

    堆栈、栈帧与函数调用过程分析

    【应聘笔记系列】堆栈、栈帧与函数调用过程分析,C-C++堆栈指引

    C语言函数调用过程中变量的同名问题的解决.pdf

    C语言函数调用过程中变量的同名问题的解决 在C语言函数调用过程中,变量的同名问题是一个常见的问题。这个问题的出现是由于函数调用过程中参数的传递、存储空间的分配、复合语句、内部变量和外部变量的使用等多个...

    C函数调用过程原理及函数栈帧分析 - 编程之道 - SegmentFault 思否1

    本文将深入探讨C函数调用过程的原理以及函数栈帧的工作机制,以帮助理解x86架构下的函数调用细节。 首先,栈是一种特殊的数据结构,采用后进先出(LIFO)原则。在函数调用中,栈主要用来存储参数、返回值、返回地址...

    堆栈-栈帧-函数调用过程分析

    CSDN 博文,对栈帧的概念以及函数调用过程栈的变化做了详细的分析!

    自动生成函数调用关系图

    自动生成c++函数调用关系图,里面包含了所有要用到的软件,一站式服务; 通过本人亲测的使用总结; 还有使用到的配置文件(c++的),实在不会配置可以直接使用; 改一改配置文件,应该还可以生成c,java,c#语言的调用...

    vlc-android打开rtsp流媒体文件函数调用过程

    对vlc-android打开rtsp流媒体文件的函数调用过程进行了分析,调用保存图为PNG格式

    函数调用时栈与寄存器的变化

    本文将通过一个具体的例子来阐述函数调用过程中栈和寄存器的具体变化情况,并配有图示帮助理解。 #### 栈的概念与作用 栈是一种先进后出(LIFO)的数据结构,在程序运行时主要用于存储函数调用过程中的临时数据。...

    c/c++中函数调用方式

    在C/C++编程语言中,函数调用方式是程序设计中的关键概念之一,它涉及到如何在函数调用过程中处理参数的传递以及栈空间的管理。根据给定的文件信息,我们可以深入探讨C/C++中几种主要的函数调用方式:__cdecl、__...

    反汇编深入分析函数调用

    #### 函数调用过程详解 **1. 参数传递** 在`main`函数中,调用`fun`函数时,首先会将参数`0x8899`和`0x1100`按照`__cdecl`调用约定,从右到左依次压入栈中。这符合Intel架构下的函数调用规则。 **2. 调用函数** 接...

    产生chkesp的函数调用方式

    在计算机编程领域,函数调用是一项基本操作,而如何管理函数调用过程中产生的堆栈则是确保程序正确执行的关键之一。本文将深入探讨与`chkesp`相关的函数调用方式,特别是其在堆栈管理和函数调用约定中的应用。 ####...

    visual c++中函数调用方式浅探

    `naked call` 是一种特殊的调用约定,允许程序员完全控制函数调用过程。在使用`naked call` 时,程序员需要显式地保存和恢复寄存器状态。这种方式通常用于对性能有极高要求的场景。 示例代码: ```cpp void __...

    【Android 11】【Bluetooth模块】Bluetooth打开函数调用流程图

    Android 11 中 Bluetooth 模块的打开函数调用流程图是一个复杂的过程,涉及到多个类和方法的交互。但是,通过对每个类和方法的分析,我们可以了解到蓝牙模块的打开流程,并更好地理解 Android 11 中蓝牙模块的工作...

    利用堆栈模拟C语言中函数的调用过程.pdf

    在C语言中,函数调用时通常会涉及到堆栈(也称为栈)的使用,这主要因为栈是一种先进后出(FILO)的数据结构,非常适合于管理函数调用过程中需要保存的临时数据。 首先,堆栈是一种线性表的数据结构,它具有特定的...

    C++自动生成函数调用关系图.rar

    函数调用是程序中一个函数被另一个函数或主程序执行的过程。 2. **控制流**:函数调用是控制流的一部分,控制流描述了程序执行的顺序。了解函数间的调用关系有助于理解代码的逻辑结构和执行顺序。 3. **静态分析**...

    Visual C++中函数调用方式浅探

    在函数调用过程中,主调函数将参数 m 和 n 压栈,然后调用 Input 函数。最后,主调函数恢复栈。 通过反汇编代码,我们可以看到 C 式调用的过程: 1. lea eax,[ebp-8] ; 取[ebp-8]地址(ebp-8),存到 eax 2. push eax...

Global site tag (gtag.js) - Google Analytics