Assembly pushl“是否;通过引用传递到堆栈";?

Assembly pushl“是否;通过引用传递到堆栈";?,assembly,stack,cpu-registers,Assembly,Stack,Cpu Registers,我在Linux上使用GAS(AT&T语法),带有32位指令 据我所知,调用函数时,被调用方的第一个操作是复制%ebp中的值,并将其放在堆栈顶部(并隐式地将%esp的值减4,以便它指向这个新堆栈“变量”)。这一切都是通过指令pushl%ebp完成的 此时,%ebp及其堆栈副本都保存垃圾。为了保留堆栈指针的当前位置以供以后参考,我们使用movl%esp,%ebp。现在%ebp的“堆栈副本”保存着这个引用地址 我的问题是:%ebp本身现在也拥有这个地址吗?在C语言中,%ebp是通过引用还是通过值“传递

我在Linux上使用GAS(AT&T语法),带有32位指令

据我所知,调用函数时,被调用方的第一个操作是复制
%ebp
中的值,并将其放在堆栈顶部(并隐式地将
%esp
的值减4,以便它指向这个新堆栈“变量”)。这一切都是通过指令
pushl%ebp
完成的

此时,
%ebp
及其堆栈副本都保存垃圾。为了保留堆栈指针的当前位置以供以后参考,我们使用
movl%esp,%ebp
。现在
%ebp
的“堆栈副本”保存着这个引用地址


我的问题是:
%ebp
本身现在也拥有这个地址吗?在C语言中,
%ebp
是通过引用还是通过值“传递”到堆栈?一般来说,修改寄存器或内存位置的“堆栈副本”是否会改变原始寄存器或内存位置中包含的值?

修改寄存器或变量的副本不会更新原始的.By值
movl%esp,%ebp
不会影响堆栈上保存的值,该
push
的目的是保存该值,以便以后恢复。此外,这不是强制性的,它只是一个传统的堆栈框架,通常不会在优化代码中使用。编辑:根据标准约定,必须保留
ebp
,而不是必须使用标准序言。“此时,
ebp
及其堆栈副本都保存垃圾”。如果一个寄存器包含一个无用的值,那么它的堆叠是没有意义的。对了,我忘了movl直接复制到寄存器。因此,ebp中的值在函数中用作参考,然后ebp堆栈副本中的“垃圾”值在尾声时弹出到ebp中?@Weather Vane有道理,我想我正在阅读的指南只是为了演示最佳实践。