кадр стека выровнять по разному? - PullRequest
0 голосов
/ 22 марта 2012

Это простой тест. Подобная тема обсуждалась в Распределение стека, заполнение и выравнивание , но когда я компилирую следующие два исходных кода, у меня возникают противоречивые результаты.

 #include <stdio.h>
 //first source code
    void haha()
    {
      printf("HI");
    }
    int main()
    {
      int b = 2;
      b = b << 1;
      haha();
      //printf("n = %d",b);
      return 0;
    }

 #include <stdio.h>
     //second source code
void haha3()
{
  int c,a,b;
  c=a+b;
} 
void haha2()
{
  int c,a,b;
  c=a+b;
  haha3();
}
int main()
{
  int b = 2;
  b = b << 1;
  haha2();
  //printf("n = %d",b);
  return 0;
}

Для первого исходного кода я получил код сборки:

haha:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    movl    $.LC0, %eax
    movl    %eax, (%esp)
    call    printf
    leave
    ret
    .size   haha, .-haha
.globl main
    .type   main, @function
main:
    pushl   %ebp
    movl    %esp, %ebp
    andl    $-16, %esp
    subl    $16, %esp
    movl    $2, 12(%esp)
    sall    12(%esp)
    call    haha
    movl    $0, %eax
    leave
    ret

Для второго исходного кода я получил код сборки:

haha3:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $16, %esp
    movl    -4(%ebp), %eax
    movl    -8(%ebp), %edx
    leal    (%edx,%eax), %eax
    movl    %eax, -12(%ebp)
    leave
    ret
    .size   haha3, .-haha3
.globl haha2
    .type   haha2, @function
haha2:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $16, %esp
    movl    -4(%ebp), %eax
    movl    -8(%ebp), %edx
    leal    (%edx,%eax), %eax
    movl    %eax, -12(%ebp)
    call    haha3
    leave
    ret
    .size   haha2, .-haha2
.globl main
    .type   main, @function
main:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $16, %esp
    movl    $2, -4(%ebp)
    sall    -4(%ebp)
    call    haha2
    movl    $0, %eax
    leave
    ret

Мой вопрос: почему кадр стека первого кода выравнивается по 24 (subl $ 24,% esp), а второй - по 16 (subl $ 16,% esp)? Как сказано в Распределение стека, заполнение и выравнивание семейство инструкций SSEx ТРЕБУЕТ упакованных 128-битных векторов для выравнивания до 16 байтов. Итак, я ожидаю, что кадр стека первого кода имеет subl $ 32,% esp и subl $ 16,% esp для второго или subl $ 24,% esp для первого и subl $ 8,% esp для второго из-за оставить и вернуть зарезервированные 8 байтов, как он сказал. Однако первый код использует 'subl $ 24,% esp', а второй использует 'subl $ 16,% esp' Спасибо за ваш интерес.

...