GCC与x64 sta

任何人都可以向我解释为什么下面的代码行int main(int argc,char * argv [])

{
int i=17;
int output=0

.....

}

将其转换为以下x64汇编代码:

pushq %rbp
movq %rsp, %rbp
subq $32, %rsp
movl %edi, -20(%rbp)
movq %rsi,-32(%rbp)
movl $17, -8(%rbp)
movl $0, -4(%rbp)
...

我不明白为什么SP减少了32个。寄存器%edi,%rsi似乎与主代码中没有使用的argc和* argv []相对应。 我认为[%esp,%rbp]之间的空间只分配给局部变量而不分配给函数参数,因此上面代码中的大小应该只有8,即rsp应该减少8而不是32。有什么解释吗?


了解...部分会有所帮助。

我假设gcc决定......部分需要寄存器,所以它将变量推入堆栈。

该堆栈可用于任何局部变量或函数参数。 SysV x64 ABI的唯一要求是前几个函数参数从寄存器开始。

然后该函数可以将参数移动到堆栈上,并根据需要将局部变量带入寄存器,这取决于编译器!

本地变量不保证放在堆栈上! 参议员也不会留在登记册中。

所以它推动argc和argv,然后它决定推我和输出。 这是24个字节的空间。 但是如果下一个函数调用,那么堆栈必须对齐到16个字节,因此到32。

尝试-O3并查看代码是否发生变化。

换一种方式:

参数如下:%rdi%rsi%rdx%rcx%rbx%r8%r9(堆栈中的额外参数)(红色区域)

是函数的开始。 然后该函数就可以对堆栈执行任何想要的操作。 是的,无论如何! 只要它返回处于它所处状态的堆栈。

(注意,这是针对系统V(除了窗口以外的所有应用程序),窗口是不同的)

链接地址: http://www.djcxy.com/p/84331.html

上一篇: GCC with x64 sta

下一篇: memory concept for static variables inside the blocks in a program