[知识点]C 函数调用机制 栈帧(stack frame) 转载

函数的调用操作包括:从一块代码到另一块代码之间的双向数据传递换和执行控制。其中:数据传递:函数参数和返回值。

大多数CPU上的程序实现使用栈来支持函数调用操作。栈用来传递函数参数、存储返回信息、临时保存寄存器原有值以用于回复以及存储局部数据。

单个函数调用操作所使用的栈部分称为栈帧结果(stack frame)。栈帧结构的两端由两个指针来指定。寄存器ebp通常用作栈帧的指针、esp用作栈的指针。esp随着数据的入栈和出栈。因此对于函数中大部分数据的访问都是通过基于帧帧指针ebp来实现。

1.png

批注:在C语言中,如果C语言的地址符'&'被应用到一个局部变量时,栈则需要为该变量生成一个地址值即变量的地址值分配一个空间。
call和ret用于处理函数调用和返回操作。

  • call:把返回地址压入栈中并且跳转到调用函数开始处并且执行。
  • ret:调用ret之前要好好处理栈中的内容。使得当前栈指针所指向的位置刚好为call指令保存的返回地址。另外若函数返回一个整数或指针,那么用eax返回。
  • main():一个函数:在编译的链接的时候它将会作为Ctr0.s汇编程序的函数被调用。ctro.s是一个桩(stu)程序,它被链接在一个用户程序的开始部分,主要用于设置一些初始化的全局变量等。
    举例:
void  swap (int *a, int *b){  
  int  c;   
 c= *a;   
 *a = *b;   
 *b = c;
}
void caller(){
int i =0,b=3;    
swap(&i,&b);
}

如图显示:(栈是向低地址扩展)

2.jpg

注意:对于返回地址的保存是在跳转到调用函数之前(调用swap之前),然后对调用函数callee的栈帧指针进行保存,此外以该栈(内存地址)作为swap的栈帧指针,通过对ebp的上下移动来调用函数的参数和局部变量。对于该函数的参数则是ebp加正整数,对于局部变量的引用是通过edp减一个整数。
ebp前面的e:32位寄存器
rbp前面的r: 64位寄存器

转载出处:C 函数调用机制 栈帧(stack frame)

更多参考:
函数调用过程(ebp,esp)

扩展基址指针寄存器(extended base pointer) 其内存放一个指针,该指针指向系统栈最上面一个栈帧的底部。

ESP(Extended stack pointer)是指针寄存器的一种(另一种为EBP)。用于堆栈指针。ESP为栈指针,用于指向栈的栈顶(下一个压入栈的活动记录的顶部)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...
    小猪啊呜阅读 10,298评论 1 19
  • 栈: 在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函...
    zjfclimin阅读 9,637评论 0 5
  • 首先寄存器使用惯例:eip :指令地址寄存器,保存程序计数器的值,当前执行的指令的下一条指令的地址值,16位中为i...
    扎Zn了老Fe阅读 6,174评论 0 0
  • 站在巨人的肩膀上——IDA PRO权威指南阅读笔记 一,窗口 view->open subviews 打开/关闭各...
    SueLyon阅读 14,927评论 0 6
  • 近来下载了国际版本的微博,发现一个蛮不错的设计。国际版本的微博采用较为简洁的设计,少了通用版本的那种紧凑感、饱满感...
    三月饭团阅读 7,916评论 0 0

友情链接更多精彩内容