7.C语言调用帧结构
IA32程序用程序栈来支持过程调用。它包括将数据(参数和返回值)和控制从代码的一部分传到另一部分,另外还包括进入时为过程的局部变量分配空间,并在退出时释放空间。一般地,机器只提供转移控制到过程和从过程中转移出控制的简单指令,数据传递、局部变量的分配和释放必然通过程序栈实现
机器用栈来传递过程参数、存储返回信息、保存寄存器用于以后恢复和本地存储。我们称为单个过程分配的那部分栈为栈帧。按前面的介绍,栈指针%esp可以移动,帧指针%esp不变化,因而大多数信息的访问都是相对于帧指针的。
支持过程调用和返回的指令
call指令:目标是指明被调用过程起始的指令地址。同跳转一样,调用可是直接的(一个标号),也可是间接的(*后加一个操作数指示符)。其效果是:将返回地址入栈,并跳转到被调用过程(P调用Q,P调用者,Q被调用者)的第一条指令处。 所谓返回地址是指在程序中紧跟call后面的那条指令的地址,这样当被调用过程返回时,执行会从此处继续。
leave指令:为返回准备栈,它等价于如下代码:
movl %ebp,%esp
popl %ebp //恢复已保存的%ebp寄存器
ret指令:从过程调用中返回。指的是从栈中弹出地址,并跳转到这个位置
IA32程序用程序栈来支持过程调用。它包括将数据(参数和返回值)和控制从代码的一部分传到另一部分,另外还包括进入时为过程的局部变量分配空间,并在退出时释放空间。一般地,机器只提供转移控制到过程和从过程中转移出控制的简单指令,数据传递、局部变量的分配和释放必然通过程序栈实现
机器用栈来传递过程参数、存储返回信息、保存寄存器用于以后恢复和本地存储。我们称为单个过程分配的那部分栈为栈帧。按前面的介绍,栈指针%esp可以移动,帧指针%esp不变化,因而大多数信息的访问都是相对于帧指针的。
支持过程调用和返回的指令
call指令:目标是指明被调用过程起始的指令地址。同跳转一样,调用可是直接的(一个标号),也可是间接的(*后加一个操作数指示符)。其效果是:将返回地址入栈,并跳转到被调用过程(P调用Q,P调用者,Q被调用者)的第一条指令处。 所谓返回地址是指在程序中紧跟call后面的那条指令的地址,这样当被调用过程返回时,执行会从此处继续。
leave指令:为返回准备栈,它等价于如下代码:
movl %ebp,%esp
popl %ebp //恢复已保存的%ebp寄存器
ret指令:从过程调用中返回。指的是从栈中弹出地址,并跳转到这个位置