我正在将以下代码片段汇编为汇编

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字节字足以容纳buffer1buffer2

最佳答案

乍一看,这似乎是内存对齐的问题。 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/

10-11 22:57