x86_64-linux-gnu:为什么减去堆栈指针?

时间:2018-02-11 21:22:50

标签: c linux assembly x86-64

我正在将以下代码段编译成程序集

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

1 个答案:

答案 0 :(得分:-1)

乍一看,这似乎是内存对齐的问题。 This question详细介绍,我会特别留意joshperry的回答:https://stackoverflow.com/a/381368

维基百科也在这里讨论:Data structure alignment

简而言之,char buffer1[5]将创建两个64字节的字(字符1-4和5+)。如果它没有,那么每次你引用buffer2时,系统必须至少执行两次操作才能获得buffer2的正确起点。