Почему мой указатель стека увеличивается только на 16? - PullRequest
5 голосов
/ 31 марта 2011

Используя следующий код C

void func() {
  int a=1,b=2,c=3;
}

Компиляция с использованием gcc -S -O -o- myfile.c Я получаю вывод

    .file   "myfile.c"
    .intel_syntax noprefix
    .text
.globl func
    .type   func, @function
func:
    push    ebp
    mov ebp, esp
    sub esp, 16
    mov DWORD PTR [ebp-4], 1
    mov DWORD PTR [ebp-8], 2
    mov DWORD PTR [ebp-12], 3
    mov DWORD PTR [ebp-16], 4
    mov DWORD PTR [ebp-20], 5
    leave
    ret
    .size   func, .-func
    .ident  "GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5"
    .section    .note.GNU-stack,"",@progbits

Здесь я ожидаю, что третья строка после func: будет sub esp,12 вместо sub esp,16. Я играл с разным количеством автоматических переменных в функции и обнаружил, что она увеличивается с шагом 16 байтов. Почему это происходит? Это происходит на всех платформах, или это зависит от платформы?

В настоящее время я использую Intel Mac с OSX, компилирую его с помощью гостевой системы Ubuntu (32-разрядная версия) VirtualBox с помощью GCC.

Ответы [ 3 ]

9 голосов
/ 31 марта 2011

С Страница руководства GCC , (выделено жирным шрифтом):

-rempredred-stack-border = num

Попыткачтобы сохранить границу стека выровненной по 2 байтам.Если -mpreferred-stack-boundary не указано, по умолчанию равно 4 (16 байтов или 128 бит) .

2 голосов
/ 12 марта 2014

x86_64 ABI требует, чтобы стек был выровнен по 16 байтов

Распределение стека, заполнение и выравнивание

Для 32-битной OS X это происходит потому, чтоSSE и некоторых других причин

Почему Mac ABI требует выравнивания стека 16 байт для x86-32?

2 голосов
/ 11 июля 2011

Это очень странный вывод.

Вы уверены, что файл c не был:

void func() {
  int a=1,b=2,c=3,d=4,e=5;
}

?

В противном случае, почему строки

mov DWORD PTR [ebp-16], 4
mov DWORD PTR [ebp-20], 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...