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