2022年2022年函数调用机制C与汇编相互调用 .pdf
《2022年2022年函数调用机制C与汇编相互调用 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年函数调用机制C与汇编相互调用 .pdf(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、函数调用机制、 C 与汇编相互调用-2012 年 11 月 22 日 22:06:23为了提高代码执行效率,代码中有些地方直接使用汇编语言编制。这就会涉及到两种语言的程序间相互调用的问题。本文首先说明C 语言函数的相互调用机制,然后使用示例来说明 C 与汇编之间的调用方法。【C 函数相互调用机制】函数调用操作包括从一块代码到另一块代码之间的双向数据传递和执行控制转移。数据传递通过函数参数和返回值来进行。另外,还需要在进入函数时为函数的局部变量分配存储空间,并且在退出函数时收回这部分空间。Intel 80 x86 CPU 为控制传递提供了简单的指令,而数据的传递和局部变量存储空间的分配和回收则通
2、过栈操作来实现。1、 栈帧结构和控制权转移方式大多数 CPU 上的程序实现使用栈来支持函数调用操作。栈被用来传递函数参数、存储返回信息、 临时保存寄存器原有值以备恢复以及用来存储局部数据。单个函数调用操作所使用的栈部分被称为栈帧(Stack frame )结构,如下图所示。栈帧结构的两端由两个指针来指定。 寄存器 ebp 通常用作帧指针 (frame pointer ) ,而 esp则用作栈指针 (stackpointer ) 。在函数执行过程中,栈指针esp 会随着数据的入栈和出栈而移动,因而函数中对大部分数据的访问都基于帧指针ebp 进行。对于函数 A 调用函数 B 的情况,传递给B 的参
3、数包含在A 的栈帧中。当A 调用 B 时,函数 A 的返回地址(调用返回后继续执行的指令地址)被压入栈中,栈中该位置也明确指明了 A 栈帧的结束处。而B 的栈帧则从随后的栈部分开始。再随后则用于存放任何保存的寄存器值以及函数的临时值。B 函数同样也使用栈来保存不能存放在寄存器中的局部变量。例如由于CPU 寄存器数量有限而不能存放函数的所有局部数据,或者有些局部变量是数组或结构,因此必须使用名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 6 页 - - - - - - -
4、- - 数组或结构引用来访问。还有就是C 语言的地址操作符“& ”被应用到一个局部变量上时,就需要为该变量生成一个地址,即为变量的地址指针分配一空间。最后,B 函数也会使用栈来保存调用任何其他函数的参数。栈是往低地址方向扩展的,而esp 指向当前栈顶处的元素。通过使用push 和 pop 指令可以把数据压入栈中或从栈中弹出。对于没有指定初始值的数据所需要的存储空间,可以通过把栈指针递减适当的值来做到。类似地,通过增加栈指针可以回收栈中已分配的空间。指令 CALL和 RET 用于处理函数调用和返回操作。调用指令CALL的作用是把返回地址压入栈中并且跳转到被调用函数开始处执行。返回地址是程序中紧随
5、调用指令CALL后面一条指令的地址。因此当被调用函数返回时就会从该位置继续执行。返回指令RET 用于弹出栈顶处的地址并跳转到该地址处。在使用该指令之前,应该先正确处理栈中内容,使得当前栈指针所指位置的内容是先前CALL指令所保存的返回地址。另外,若返回值是一个整数或一个指针,那么寄存器eax 将被默认用来传递返回值。尽管某一时刻只有一个函数在执行,但还是需要确定在一个函数调用其它函数时,被调用者不会修改或覆盖掉调用者今后要用到的寄存器内容。因此 Intel CPU 采用了所有函数必须遵守的寄存器用法统一惯例。该惯例指明,寄存器eax、edx、ecx 的内容必须由调用者自己负责保存。寄存器ebx
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年2022年函数调用机制C与汇编相互调用 2022 函数 调用 机制 汇编 相互
限制150内