汇编语言中堆栈指针的使用问题

4

我正在阅读维基百科上关于“尾递归”的文章:http://en.wikipedia.org/wiki/Tail_call

现在,在文章的结尾处,示例展示了使用堆栈指针来访问汇编伪代码中函数调用传递的参数。这不是错误的吗?我的意思是说,调用者应该使用帧指针而不是堆栈指针来访问参数对吗?

2个回答

4
使用堆栈指针是可以的。毕竟它总是指向堆栈。只是如果函数中有任何push或pop指令,就很难跟踪从堆栈指针到函数参数的偏移量。而且当没有帧指针时,在调试器中回溯堆栈非常困难。
使用帧指针可以使调试器和编译器编写者的工作更容易,但并非必须要有一个帧指针。
设置帧指针需要一条指令,并且它会占用可能用于其他事情的寄存器。因此,使用堆栈指针来优化代码是一种常见技术。微软编译器甚至为此优化命名,称其为帧指针省略

John,我有一个快速的问题。当你说调试器的工作使用帧指针变得容易时,你指的是哪个调试器? - name_masked
任何调试器。当您拥有帧指针时,可以轻松重构调用堆栈并在调试窗口中显示它。如果没有帧指针,则调试器必须实际反编译代码才能显示调用堆栈。 - John Knoeller
好的,基本上在Windows上调试器总是有更多的工作要做。你知道Linux是否使用帧指针吗? - name_masked
这并不是一个操作系统的决定,编译器会选择是否使用帧指针,如果需要的话,它可以为每个函数选择不同的方式。当编译器优化关闭时,使用帧指针是相当标准的。但我真的不确定。 - John Knoeller

3

在常见的ABI中,专用的帧指针寄存器是一种更受欢迎的调用约定,但是当纯粹为了说明目的时,使用不同(可能更简单)的调用约定并没有 intrinsically “wrong”(本质上“错误”)之处(将帧指针寄存器添加到这些代码片段中只会使它们稍微长一点,而且不会改变任何实质性的东西)。


谢谢提供的信息。目前这个网站是最好的。 - name_masked

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接