函数调用机制、 C 与汇编相互调用
--2012 年 11 月 22 日 22:06:23
为了提高代码执行效率,代码中有些地方直接使用汇编语言编制。这就会涉及到两种
语言的程序间相互调用的问题。本文首先说明 C 语言函数的相互调用机制,然后使用示例
来说明 C 与汇编之间的调用方法。
【C 函数相互调用机制】
函数调用操作包括从一块代码到另一块代码之间的双向数据传递和执行控制转移。数
据传递通过函数参数和返回值来进行。另外,还需要在进入函数时为函数的局部变量分配
存储空间,并且在退出函数时收回这部分空间。 Intel 80x86 CPU 为控制传递提供了简单的
指令,而数据的传递和局部变量存储空间的分配和回收则通过栈操作来实现。
1、 栈帧结构和控制权转移方式
大多数 CPU 上的程序实现使用栈来支持函数调用操作。栈被用来传递函数参数、存储
返回信息、 临时保存寄存器原有值以备恢复以及用来存储局部数据。 单个函数调用操作
所使用的栈部分被称为栈帧( Stack frame )结构,如下图所示。栈帧结构的两端由两个
指针来指定。 寄存器 ebp 通常用作帧指针 (frame pointer ),而 esp 则用作栈指针 (stack
pointer )。在函数执行过程中,栈指针 esp 会随着数据的入栈和出栈而移动,因而函数
中对大部分数据的访问都基于帧指针 ebp 进行。
对于函数 A 调用函数 B 的情况,传递给 B 的参数包含在 A 的栈帧中。当 A 调用 B 时,
函数 A 的返回地址(调用返回后继续执行的指令地址)被压入栈中,栈中该位置也明确指
明了 A 栈帧的结束处。而 B 的栈帧则从随后的栈部分开始。再随后则用于存放任何保存的
寄存器值以及函数的临时值。
B 函数同样也使用栈来保存不能存放在寄存器中的局部变量。例如由于 CPU 寄存器数
量有限而不能存放函数的所有局部数据,或者有些局部变量是数组或结构,因此必须使用
评论0
最新资源