Случайно, читая ассемблерный листинг примера программы на C, я заметил, что указатель стека не выровнен по 16 битам перед вызовом функции foo:
void foo() { }
int func(int p) { foo(); return p; }
int main() { return func(1); }
func:
pushq %rbp
movq %rsp, %rbp
subq $8, %rsp ; See here
movl %edi, -4(%rbp)
movl $0, %eax
call foo
movl -4(%rbp), %eax
leave
ret
Инструкция subq $8, %rsp
делает невыровненным RSP перед вызовом foo (должно быть "subq $16, %rsp").
В System V ABI, пар. 3.2.2, я прочитал: «значение (%rsp − 8) всегда кратно 16, когда управление передается точке входа в функцию».
Кто-нибудь может помочь мне понять, почему gcc не ставит subq $16, %rsp
?
Заранее спасибо.
Изменить: я забыл упомянуть свою ОС и версию компилятора:
Debian wheezy, gcc 4.7.2
call func
, которая привела вас туда, уже поместила что-то в стек, как иpushq %rbp
. Возможно, передcall
были и другие инструкции, которые передавали аргументы и т. д. - person twalberg   schedule 08.04.2014