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++中到底是怎样实现一个函数的调用的呢?参数入栈、函数跳转、保护现场、回复现场等又是怎样实现的呢?本文将对函数调用的过程进行深入的分析和详细解释,并在VC ...
"read()函数调用过程剖析" 本文详细介绍了read()函数在Linux系统中调用过程,从用户层到文件系统层、通用块层、page cache层、驱动层到设备层的过程。 一、read()函数调用过程 read()函数调用过程可以分为两个...
本文将深入探讨函数调用过程中涉及的关键概念:堆栈帧、函数调用和堆栈切换。 首先,我们要理解堆栈帧(Stack Frame)。在计算机科学中,堆栈是一种特殊的内存区域,遵循“后进先出”(LIFO)原则。每当一个函数被...
在深入分析C++函数调用过程之前,我们需要了解一些基础概念和术语。在函数调用中,CPU执行的是一个由call指令引导的过程,这本质上是程序执行流程的一个中断和转移。函数调用过程涉及到的几个关键步骤包括参数入栈、...
【应聘笔记系列】堆栈、栈帧与函数调用过程分析,C-C++堆栈指引
C语言函数调用过程中变量的同名问题的解决 在C语言函数调用过程中,变量的同名问题是一个常见的问题。这个问题的出现是由于函数调用过程中参数的传递、存储空间的分配、复合语句、内部变量和外部变量的使用等多个...
本文将深入探讨C函数调用过程的原理以及函数栈帧的工作机制,以帮助理解x86架构下的函数调用细节。 首先,栈是一种特殊的数据结构,采用后进先出(LIFO)原则。在函数调用中,栈主要用来存储参数、返回值、返回地址...
CSDN 博文,对栈帧的概念以及函数调用过程栈的变化做了详细的分析!
自动生成c++函数调用关系图,里面包含了所有要用到的软件,一站式服务; 通过本人亲测的使用总结; 还有使用到的配置文件(c++的),实在不会配置可以直接使用; 改一改配置文件,应该还可以生成c,java,c#语言的调用...
对vlc-android打开rtsp流媒体文件的函数调用过程进行了分析,调用保存图为PNG格式
本文将通过一个具体的例子来阐述函数调用过程中栈和寄存器的具体变化情况,并配有图示帮助理解。 #### 栈的概念与作用 栈是一种先进后出(LIFO)的数据结构,在程序运行时主要用于存储函数调用过程中的临时数据。...
在C/C++编程语言中,函数调用方式是程序设计中的关键概念之一,它涉及到如何在函数调用过程中处理参数的传递以及栈空间的管理。根据给定的文件信息,我们可以深入探讨C/C++中几种主要的函数调用方式:__cdecl、__...
#### 函数调用过程详解 **1. 参数传递** 在`main`函数中,调用`fun`函数时,首先会将参数`0x8899`和`0x1100`按照`__cdecl`调用约定,从右到左依次压入栈中。这符合Intel架构下的函数调用规则。 **2. 调用函数** 接...
在计算机编程领域,函数调用是一项基本操作,而如何管理函数调用过程中产生的堆栈则是确保程序正确执行的关键之一。本文将深入探讨与`chkesp`相关的函数调用方式,特别是其在堆栈管理和函数调用约定中的应用。 ####...
`naked call` 是一种特殊的调用约定,允许程序员完全控制函数调用过程。在使用`naked call` 时,程序员需要显式地保存和恢复寄存器状态。这种方式通常用于对性能有极高要求的场景。 示例代码: ```cpp void __...
Android 11 中 Bluetooth 模块的打开函数调用流程图是一个复杂的过程,涉及到多个类和方法的交互。但是,通过对每个类和方法的分析,我们可以了解到蓝牙模块的打开流程,并更好地理解 Android 11 中蓝牙模块的工作...
在C语言中,函数调用时通常会涉及到堆栈(也称为栈)的使用,这主要因为栈是一种先进后出(FILO)的数据结构,非常适合于管理函数调用过程中需要保存的临时数据。 首先,堆栈是一种线性表的数据结构,它具有特定的...
函数调用是程序中一个函数被另一个函数或主程序执行的过程。 2. **控制流**:函数调用是控制流的一部分,控制流描述了程序执行的顺序。了解函数间的调用关系有助于理解代码的逻辑结构和执行顺序。 3. **静态分析**...
在函数调用过程中,主调函数将参数 m 和 n 压栈,然后调用 Input 函数。最后,主调函数恢复栈。 通过反汇编代码,我们可以看到 C 式调用的过程: 1. lea eax,[ebp-8] ; 取[ebp-8]地址(ebp-8),存到 eax 2. push eax...