我在Linux上使用GAS(AT& T语法),带有32位指令。
据我了解,在调用函数时,被调用者的第一个动作是复制%ebp
中的值并将其置于堆栈顶部(并隐式地减少{{1}的值4,以便它指向这个新的堆栈“变量”)。这都是通过指令%esp
完成的。
此时,pushl %ebp
及其堆栈副本都存在垃圾。为了保留堆栈指针的当前位置以供以后参考,我们使用%ebp
。现在movl %esp, %ebp
的“堆栈副本”保存了此参考地址。
我的问题:%ebp
本身现在也持有此地址吗?在C语言中,%ebp
是通过引用或值传递给堆栈的?一般来说,修改寄存器或存储单元的“堆栈副本”是否会改变原始寄存器或存储单元中包含的值?