您的位置 首页 产品

谈谈arm下的函数栈

引言这篇文章简要说说函数是怎么传入参数的,我们都知道,当一个函数调用使用少量参数(ARM上是少于等于4个)时,参数是通过寄存器进行传…

导言

  这篇文章扼要说说函数是怎样传入参数的,咱们都知道,当一个函数调用运用少数参数(ARM上是少于等于4个)时,参数是经过寄存器进行传值(ARM上是经过r0,r1,r2,r3),而当参数多于4个时,会将多出的参数压入栈中进行传递(其实在函数调用过程中也会把r0,r1,r2,r3传递的参数压入栈),详细是什么完成的呢,咱们看看。

函数栈

  首要咱们需求了解一下linux下一个进程的内存地址空间是怎么布局的,在linux中,0~3G的虚拟地址为进程一切,3G~4G由内核所运用,每一个进程都有自己独立的0~3G内存地址空间。当进程进行函数调用时,咱们都知道传入被调用函数的参数是经过栈进行操作的,这儿咱们只需求简略了解一下linux的内存地址空间中的栈是自顶向下成长的,便是栈底出于高地址处,栈顶出于低地址处。

  好的,简略了解了内存地址空间的栈后,咱们还需求简略了解一下EBP和ESP这两个寄存器,EBP是用保存栈低地址的,而ESP用于保存栈顶地址,而每一次函数调用会涉及到一个栈帧,

举个实例详细阐明一下一个函数帧的特色,比方

1 /* B被A调用2  * 参数:data1, data2, data33  * 局部变量: s1, s2, s3 */4 void B (int data1, int data2, int data3)5 {6     int b_s1;7     int b_s2;8     int b_s3;9 }10  11 /* A调用B函数 */12 void A (void)13 {14     int a_s1;15     int a_s2;16     int a_s3;17     18     B (1, 2, 3);19     printf ("1\n");20 }

在以上比如中栈帧状况如下图所示

  从图例中能够看出,当A函数没有调用B函数时,A函数的栈帧只保存着局部变量,而EBP(栈底指针)指向的是A函数的函数栈帧头,而当A函数调用B函数时,A函数会将B函数所需求的参数从右往左压入栈(在比如中先压入3,之后是2,最终是1),之后会将A调用完B之后所需求运转的第一条指令压入栈,此刻树立一个B的栈帧,详细流程:

  • 从右往左将B函数所需参数压入栈
  • 压入碑文完B函数之后的第一条指令地址
  • 树立B栈帧
  • 压入A栈帧的栈底
  • 压入B函数维护的寄存器
  • 压入B函数的局部变量

小结

  其实每一种处理器架构所运用的方法都不相同,在arm上我几个参数和不定参数的状况经过汇编代码检查又不相同,之后反汇编后研讨透了会再发布一篇博文专门说这个,现在这篇就当做一个入门常识吧。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/chanpin/264110.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部