Assembly pushl“是否;通过引用传递到堆栈";?
我在Linux上使用GAS(AT&T语法),带有32位指令 据我所知,调用函数时,被调用方的第一个操作是复制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是通过引用还是通过值“传递
%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有道理,我想我正在阅读的指南只是为了演示最佳实践。