【发布时间】:2017-01-25 14:56:03
【问题描述】:
进入函数,标准序言
push rbp
mov rbp, rsp
sub rsp, 128 ; large space for storing doubles, for example
现在如何引用局部变量,通过rsp +正偏移,还是通过rbp +负偏移?
阅读https://en.wikibooks.org/wiki/X86_Disassembly/Functions_and_Stack_Frames,确实很好理解。 它写道
...esp 的值不能可靠地用于确定(使用适当的偏移量)特定局部变量的内存位置。为了解决这个问题,许多编译器使用 ebp 寄存器的负偏移量来访问局部变量。
为什么不可靠?在那个问题之前,我通过 rsp 访问局部变量,如下所示:
mov rax, [rsp+.length] ; get length of array
mov [rsp+8], rax ; store sum at the stack
使用 rsp 进行堆栈引用,一切都很顺利。
【问题讨论】:
-
栈指针可以经常用来确定栈上变量的地址。但是,如果函数使用可变长度数组或
alloca()的等效项,则可能不再可能使用堆栈指针的偏移量。 -
@EOF,所以除了这两个之外,在所有情况下都应该使用相对于 rsp 的寻址?