帧指针说明


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.