帧指针说明


28

在MIPS程序集中,有一个寄存器用于堆栈指针,另一个寄存器用于帧指针。什么是帧指针,其目的是什么?它与堆栈指针有何不同?


1
您已经进行了哪些研究-您对这些术语有什么熟悉?这是用于什么系统(不同的系统具有不同的术语)?

我只想熟悉框架指针(mips程序集)。我不知道它有什么帮助,为什么我们需要它?非常感谢
— qwaserdftyghuijkiii

Answers:


44

在MIPS程序集中,堆栈指针指向堆栈的顶部。在堆栈上分配空间时,堆栈指针($ sp)移至指向可用内存。

当在MIPS程序集中调用子例程时(当时寄存器非常宝贵-非常规的基于寄存器的参数),将参数写入堆栈,然后前进堆栈指针。

该方法开始时,参数的偏移量可能为16($sp)。但是,由于将变量放置在堆栈上,所以堆栈指针会移动,并且现在可能位于相同的参数处24($sp)。这会使代码有些混乱。

框架指针($ fp)指向堆栈框架的开始,并且在子例程调用期间不会移动。这指向堆栈框架的基础,并且传递给子例程的参数相对于框架指针保持在恒定位置。

意识到将需要使用修改它的子例程调用来存储和还原帧指针。

进一步阅读:


我不知道“当时的寄存器非常珍贵-基于寄存器的参数是非常规的”的含义,但是当寄存器的数量受到限制时,参数也可以放在堆栈中。例如,如果您有35个参数(我相信MIPS具有32个注册表),那么您将需要将最后3个参数放到堆栈上。对于实现而言,FP也将位于内存中返回地址所在的地址。
— 乔纳森

1
@Jonathan MIPS在这32个寄存器中,$ 0为0。$ at被保留,$ v0和$ v1是函数调用的返回值,$ a0-$ a3是函数参数,$ t0-$ t9是临时变量(调用者保留)。 ,$ s0-$ s7已保存,系统本身使用了$ gp,$ sp,$ fp和$ ra。总而言之,只有24个通用寄存器,如果要使用,其中一些会产生开销。通常只使用$ t寄存器(10)。将其与具有128个寄存器的Itanium进行比较。在带有35个参数的MIPS中调用一个函数,您可能会将它们全部放在堆栈中。

@Jonathan我还将指出此评论:“ AMD推土机:96个物理GPR,英特尔Sandy Bridge:160个物理GPR,英特尔Haswell:168个物理GPR”。多台核心机器使事情变得有趣。SPARC有160个寄存器。我还要指出的是,注册窗口已进入MIPS的一些设计理念,其注册数量是其同期的一半。

因此,这%ebp与x86调用约定中对“基本指针”寄存器的常规使用相同吗?(我是这一切的新手,但这听起来和使用sth like一样基本MOV 8(%ebp), %eax吗?)
— ELLIOTTCABLE

界线Realize that the frame pointer will need to be stored and restored with subroutine calls that modify it.不太清楚,这意味着什么
— 扎丹(Zadane)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.