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

问题描述 投票:0回答:2

我一直认为

SP
BP
相关,这意味着在堆栈上压入和弹出内容将使用地址
BP
-
SP
,其中
BP
是堆栈的开头,并且
SP
是堆栈顶部的当前项目。然而,在查看了 CDECL 调用约定之后,这没有意义,因为
SP
被分配给
BP
的值。那么,如果我改变
BP
,是否会影响
SP
BP
甚至用于
push
/
pop
指令吗?或者
push
/
pop
只能与
SP
一起使用吗?还需要
BP
吗?

assembly x86 stack stack-frame stack-pointer
2个回答
7
投票

那么,如果我改变 BP,是否也会影响 SP? BP 是否也用于入栈/出栈指令?

不,不。

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


3
投票

x86 中的通用寄存器都没有“远距离虚假动作”,更改一个寄存器不会影响其他任何寄存器。 BP只是一个普通的寄存器。按照惯例,它用于存储当前堆栈帧的基址,但仅此而已(在优化时,大多数时候甚至没有这样做,因为很少需要这样做)。 SP也是一个普通寄存器,但它的特殊之处在于它被某些指令隐式修改,即

push
pop
call
ret
等,并且它必须保持适当的堆栈规则或函数调用(或者更确切地说,返回)将会中断。

© www.soinside.com 2019 - 2024. All rights reserved.