我总是认为SP
与BP
相关,(意味着推送/弹出堆栈中的内容会使用地址BP
- SP
, BP
是堆栈的开头,SP
是堆栈顶部的当前项目。但是,在查看CDECL调用约定之后,这是没有意义的,因为SP
已分配给BP
的值。那么,如果我更改BP
,这是否会影响SP
? BP
是否用于push
/ pop
指令?或push
/ pop
只与SP
一起使用?是否需要BP
?
答案 0 :(得分:5)
所以,如果我改变血压,这是否会影响SP? BP甚至用于推/弹指令吗?
不,不。
BP
/ EBP
/ RBP
通常用于保存函数当前stack frame的地址。也就是说,相对于函数参数和局部变量的地址将在整个函数中保持不变(而堆栈指针可能会暂时改变)。
PUSH
/ POP
或CALL
/ RET
等说明会更改SP
/ ESP
/ RSP
,但不会更改BP
} / EBP
/ RBP
。
答案 1 :(得分:1)
x86中的通用寄存器都没有“远处的虚假动作”,更改一个不接触任何其他寄存器。 BP只是一个普通的注册。按惯例,它用于存储当前堆栈帧的基础,但就是这样(并且在优化时大部分时间都没有这样做,因为它很少需要)。 SP也是一个普通的寄存器,但它是特殊的,因为它被某些指令隐含地修改,即push
,pop
,call
,ret
等。 ,它必须保持适当的堆栈规则或函数调用(或者更确切地说,返回)将会中断。