0x02

过程

一个过程调用包括将数据(以过程参数和返回值的形式)和控制从代码的一部分传递到另一部分。另外,它还必须在进入时为过程的局部变量分配空间,并在退出时释放这些空间。

程序用程序栈来支持过程调用。栈用来传递过程参数、存储返回信息、保存寄存器以供以后恢复之用,以及用于本地存储。为单个过程分配的那部分栈称为栈帧。栈帧的最顶端是以两个指针定界的,寄存器%ebp作为帧指针,而寄存器%esp作为栈指针。

假设过程P(调用者)调用过程Q(被调用者)。Q的参数放在P的栈帧中。另外,当P调用Q时,P中的返回地址被压入栈中,形成P的栈帧的末尾,返回地址就是当程序从Q返回时应该继续执行的地方。Q的栈帧从保存的帧指针的值开始,后面是保存的其他寄存器的值。

过程Q也用栈来保存其他不能存放在寄存器中的局部变量,是因为:

  • 寄存器不够存放所有的局部变量。
  • 有些局部变量是数组或结构,因此必须通过数组或结构引用来访问。
  • 要对一个局部变量使用地址操作符"&",因此必须能为它产生一个地址。
  • 存放它调用其他过程的参数。

根据惯例,寄存器%eax、%edx和%ecx被划分为调用者保存寄存器。即当过程P调用Q时,Q可以覆盖这些寄存器,而不会破坏任何P所需要的数据。另外,寄存器%ebx、%esi和%edi被划分为被调用者保存寄存器。意味着Q必须在覆盖它们之前,将这些寄存器的值保存到栈中,并在返回前恢复它门,因为P可能会在今后的计算中需要这些值。GCC使用后一种方法,因为它会尽量减少写和读栈的次数。

posted @   Pannnn  阅读(299)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
-->
点击右上角即可分享
微信分享提示