在功能输入,标准的序言如何引用堆栈正确
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
@EOF,所以应该在所有情况下使用相对于rsp的寻址,除了两个? –