(x86)ESP的值是否相对于EBP?

时间:2013-11-30 01:07:26

标签: assembly x86 stack

我总是认为SPBP相关,(意味着推送/弹出堆栈中的内容会使用地址BP - SPBP是堆栈的开头,SP是堆栈顶部的当前项目。但是,在查看CDECL调用约定之后,这是没有意义的,因为SP已分配给BP的值。那么,如果我更改BP,这是否会影响SPBP是否用于push / pop指令?或push / pop只与SP一起使用?是否需要BP

2 个答案:

答案 0 :(得分:5)

  

所以,如果我改变血压,这是否会影响SP? BP甚至用于推/弹指令吗?

不,不。

BP / EBP / RBP通常用于保存函数当前stack frame的地址。也就是说,相对于函数参数和局部变量的地址将在整个函数中保持不变(而堆栈指针可能会暂时改变)。
PUSH / POPCALL / RET等说明会更改SP / ESP / RSP,但不会更改BP } / EBP / RBP

答案 1 :(得分:1)

x86中的通用寄存器都没有“远处的虚假动作”,更改一个不接触任何其他寄存器。 BP只是一个普通的注册。按惯例,它用于存储当前堆栈帧的基础,但就是这样(并且在优化时大部分时间都没有这样做,因为它很少需要)。 SP也是一个普通的寄存器,但它是特殊的,因为它被某些指令隐含地修改,即pushpopcallret等。 ,它必须保持适当的堆栈规则或函数调用(或者更确切地说,返回)将会中断。