在功能輸入,標準的序言如何引用堆棧正確
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的尋址,除了兩個? –