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