我正在将以下代码片段汇编为汇编
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
}
void main() {
function(1,2,3);
}
这是
function
的汇编代码段function:
pushq %rbp
movq %rsp, %rbp
subq $48, %rsp ; why is 48 being subtracted from the stack pointer?
movl %edi, -36(%rbp)
movl %esi, -40(%rbp)
movl %edx, -44(%rbp)
movq %fs:40, %rax
movq %rax, -8(%rbp)
xorl %eax, %eax
我在64位计算机上运行此命令,因此我认为三个8字节字足以容纳
buffer1
和buffer2
。 最佳答案
乍一看,这似乎是内存对齐的问题。 This question涉及更多细节,我特别注意joshperry的回答:https://stackoverflow.com/a/381368
维基百科在这里也谈到了这一点:Data structure alignment
简而言之,char buffer1[5]
将创建两个64字节的字(字符1-4和5+)。如果没有,那么每次您引用buffer2
时,系统都必须至少执行两次操作才能获得buffer2
的正确起点。
关于c - x86_64-linux-gnu:为什么要减去堆栈指针?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48736610/