x86-64 Соглашение о вызове, push base ptr должно быть 8 байтов - PullRequest
1 голос
/ 01 ноября 2011

В сборке x86-64 я вижу что-то подобное для своей основной функции ...

push   %rbp 
mov    %rsp, %rbp
mov    %edi,-0x14(%rbp)
mov    %rsi,-0x20(%rbp)
movl   $0x0,-0x4(%rbp)
movl   $0x0,-0x8(%rbp)

Обратите внимание, что первым делом он бросает базовый указатель в стек.Затем он перемещает старую вершину стека (rsp) в базовый регистр ptr.

Вот мой вопрос, последние две строки инициализируют локальные переменные равными 0. Они имеют смещение -4 и -8с базы птр.НО ... если старый базовый указатель находится по смещению 0 от нового базового ptr, как это может быть?Старый базовый указатель должен иметь длину 8 байт, поскольку это 64-битный компьютер.Поэтому локальные переменные не должны начинаться до -0x8 (rbp).

1 Ответ

4 голосов
/ 01 ноября 2011

Старый базовый указатель находится на 0(%rbp). Занимает байты от 0(%rbp) до 7(%rbp). Байт в -4(%rbp) не перекрывает старый базовый указатель. (Также как и остальные байты -3(%rbp), -2(%rbp) и -1(%rbp).)

...