首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【编程基础】C函数调用过程

这几天在看GCC Inline Assembly,在C代码中通过asm或__asm__嵌入一些汇编代码,如进行系统调用,使用寄存器以提高性能能,需要对函数调用过程堆栈帧(Stack Frame)、CPU...32位虚拟地址空间高1GB空间是留给操作系统内核,栈由高地址到低地址向下增长,堆由低地址到高地址向上增长。 C中如 malloc 等分配内存在堆中分配。...初始化了静态变量和全局变量放在Data段中。未初始化全局变量和局部静态变量放在Bss段中,更准确说是在Bss段为它们预留了空间。非静态局部变量是在函数调用过程中暂存在栈上。 2....(4) 上下文:保存在函数调用过程中需要保持不变寄存器(函数调用),如ebx,esi,edi等。由被调函数执行。 (5) 临时变量,如非静态局部变量。 下面是一个函数堆栈帧结构图: ?...压入函数参数和返回地址过程是由函数调用方在调用函数之前将其压入栈中,每个函数执行后首先要执行就是把函数调用EBP寄存器压入栈中,之后是在栈上开辟一些空间存放局部变量,最后把要保存寄存器压入栈中

89050

C语言】汇编角度剖析函数调用整个过程

提示:本文意在使用汇编语言给大家介绍函数调用中栈区上过程变化,加深我们对于代码底层理解,由于不同编译器使用下,可能造成一些差异,但这并不影响我们对于知识原理掌握,所以本文不必过多纠结细节处变化...call指令是调用子程序,后面紧跟应该是子程序名或者过程名。...ret 二、函数栈帧创建与销毁过程(从汇编角度去看) 1.从下面的原码中我们也可以看出,其实我们main函数也是被其他函数调用。...我们会在调用函数前进行函数参数内容,进行一个压栈操作,当进入到被调用函数内部时候,我们会通过指针偏移量找到函数参数,并对其进行操作。...我们会通过汇编语言中call指令,先将其下一条指令IP压栈到我们栈帧空间当中,并且指向call指令,会进入到被调用函数汇编代码当中,进行被调用函数汇编指令 并且我们函数调用结束后,通过ret指令能够回到上一层函数

1K10
您找到你想要的搜索结果了吗?
是的
没有找到

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

引言 函数调用过程实际上也就是一个中断过程,那么C++中到底是怎样实现一个函数调用呢?参数入栈、函数跳转、保护现场、回复现场等又是怎样实现呢?...本文将对函数调用过程进行深入分析和详细解释,并在VC 6.0环境下进行演示。分析不到位或者存在错误地方请批评指正,请与作者联系。...看下面这个简单程序并在VC 6.0中查看并分析汇编代码。 ? 图1 1. 函数调用 g_func函数调用汇编代码如图2: ?...现在进入了一个中断函数函数执行过程中也需要ebp寄存器,而在进入函数之前main函数ebp值怎么办呢?为了不被覆盖,将它压入栈中保存。...这样由于函数调用在栈中添加所有数据都已清除,栈顶指针(ESP)真正回到了函数调用位置,所有寄存器值也恢复到了函数调用之前。

2.2K40

图解函数调用过程

各位新年快乐,祝愿大家新一年里,健康快乐相伴,好运接憧而至。 函数调用是编程语言都有的概念,也许你听说过函数调用栈,但是大家都知道函数调用是如何完成吗?...我们为什么要了解这个过程: 对于程序运行机制中数据结构和实现了解,对自己开发程序有着启发作用 碰到一些疑难杂症时候,比如函数栈溢出了或者函数栈破坏了,如何从蛛丝马迹中寻找问题原因。...了解栈溢出可能带来危害,黑客也许会利用栈溢出漏洞进行攻击。 这篇博文我们一起来对函数调用过程进行探究。 程序样例 下面是这篇博文要用到一个样例程序:程序在main中调用了FunAdd函数。...函数调用基本知识: 每个线程都有一个自己函数调用栈 栈也是程序申请一段内存,随着栈使用而增长。...后面将进入详细函数调用过程讲解,这里会涉及到少量Intel汇编。

2.2K71

C++调用C函数

前言:以前见到extern "C"这样语句,只是简单地知道跟外部链接有关,但是没有深刻理解它意思。 首先,为什么要使用extern "C"修饰符?...C++调用其它语言函数,由于编译器生成函数机制不一样,所以需要经过特殊处理,才可以调用调用C语言函数,需要在函数声明地方语句extern "C"。...刚开始,我简单地在C++源文件前面使用该语句声明,但是还是出错,而且是在编译阶段就报错。 error C2732: 链接规范与“DeleteStack”早期规范冲突。 为什么会出现这个错误呢?...因为C++源文件已经引入了C头文件,在头文件里,声明该函数时没有extern修饰,而这里有extern修饰,所以冲突了。解决办法有两个。 一。在C头文件中加上extern修饰符。 直接加,也不行。...以上为单个形式,复合形式可以同时将几个函数声明为extern "C" extern "C" { void DeleteStack(Stack stack); void PrintStack(Stack

2.8K40

C语言 | 函数调用

C语言函数调用形式 一般形式 函数名(实参表列) 函数调用语句 把函数调用单独作为一个语句。 函数参数 函数调用作为另一个函数调用实参。 调用函数并不一定要求包括分号。...只有作为函数调用语句才需要有分号。如果作为函数表达式或函数参数,函数调用本身是不必有分号C语言函数调用数据传递 在调用有参函数时,主调函数和被调函数之间有数据传递关系。...在调用函数过程中发生实参与形参间数据传递,称为“虚实结合”。 实参可以是常量、变量或表达式,实参与形参类型应相同或赋值兼容。...C语言函数调用过程 在定义函数中指定形参,在未出现函数调用时,它们并不是占内存中存储单元。 将实参对应值传递给形参。 通过return语句将函数值带回到主调函数调用结束,形参单元被释放。...实参向形参数据传递是“值传递”,单向传递,只能由实参传给形参,而不能由形参传给实参。 C语言函数返回值 函数返回值是通过函数return语句获得

3.3K10

lua调用C函数

Lua采取是利用栈进行交互,利用各种Lua_pushXXX将不同值压入栈中,然后调用Lua脚本时自然会退栈取出参数运行,对于Lua虚拟机来说,就像是发生了一次正常函数调用。...(这里采用栈是Lua栈,因为若是C栈的话调用LuaC API就会出错了。)...typedef int (*lua_CFunction) (lua_State *L); 能够被Lua调用C函数都必须是这种规则。函数返回int值表示C函数返回值个数。...void lua_pushcfunction (lua_State *L, lua_CFunction f); 将C函数压栈,接收一个C函数指针参数,然后将一个Lua.function类型对象压栈...require("power") print(square(1.44)) 参考 从lua调用C函数 Lua初学者(四)–Lua调用原理展示(lua堆栈) Lua中调用C函数

2.8K31

函数调用过程(栈帧)

开发环境 Ubuntu 14.04(32bits) GCC 编辑器 Cmd Markdown 画图工具 Processon 1,函数调用过程 今天先介绍下基本函数调用过程,即栈帧。...1.1栈帧 每个函数调用都对应一个栈帧。每个栈帧由ESP和EBP寄存器来确定。每个函数执行时,其局部变量都是在自己对应栈帧内分配内存。...假设A函数调用B函数,此时正在执行B函数,需要指出是,当执行完当前函数B后,返回调用函数A,此时执行函数B时,为B函数局部变量分配内存空间也就不存在了。...即如不能出现如下两种形式之一: int *test() {   int i=123;   return &i; } 或者 int &test() {   int i=123;   return i; } 1.2函数调用过程对应汇编代码...(%esp), %eax //将变量i值赋给eax寄存器 movl %eax, (%esp) //将变量i值压栈 call test //调用test函数,其中将下条指令(即movl %eax

81620

c++函数调用函数编写(写自己函数)以及数组调用,传递

参考链接: C++函数 在matlab里.m文件分执行文件和函数文件 在c++中执行文件指:main函数 函数文件:其他所有需要用到函数  在c++中,函数文件名没有特殊讲究,将文件添加到工程目录便能使用...  对函数要求有三点  函数完整文件 输入参数定义 函数声明加入头文件  1.函数完整文件  #include using namespace cv;...这里还有一点编程技巧 我们通过函数调用方式进行运算,有两种方式得到运算结果 ①设置函数返回值,return ②将传入值地址(即传入值自身)交给函数函数对其进行运算相当于直接对传入值进行运算。 ...2.输入参数定义  我们在main中调用其他函数时,我们输入参数需要提前定义  main () { Mat frame;  int mytime = 10; int imageWidth = 1280...3.函数声明加入头文件  我们调用其他函数前必须先声明 将   void cameracapture(Mat &frame, int mytime, int imageWidth,int imageHeight

2.2K30
领券