我准备在维基百科上发布一篇关于尾递归的文章:http://en.wikipedia.org/wiki/Tail_call
现在在本文结尾处,该示例显示堆栈指针用于访问在程序集伪代码中传递给函数调用的参数。这不对吗?我的意思是被调用者通过使用右边的帧指针而不是堆栈指针来访问参数?
答案 0 :(得分:4)
使用堆栈指针很好。它总是指向堆栈。如果函数中有任何推送或弹出指令,则跟踪堆栈指针到函数参数的偏移量有点困难。当没有帧指针时,它很难在调试器中将堆栈移回。
使用帧指针可以使调试器和编译器编写器的工作更容易,但是没有必要使用它。
设置帧指针需要一条指令,它会占用一个可能用于其他事情的寄存器。因此,使用堆栈指针是优化代码的常用技术。 Microsoft编译器甚至有一个这个优化的名称,他们称之为Frame Pointer Omission
答案 1 :(得分:3)
专用帧指针寄存器绝对是普通ABI中更受欢迎的调用约定,但在使用不同(可能更简单)的调用约定时,它纯粹用于说明目的并没有任何本质上的“错误”(添加一个帧指针注册到那些片段只会让它们变得更长并且没有任何重大变化。