Резерв байтов в стеке: сборка x86 (64 бит)


pushq   %rbp
movq    %rsp, %rbp
subq    $32, %rsp

У меня есть большой вопрос относительно объяснения "$32" в третьей инструкции. Информация из поиска и блогов указывает, что в приведенной выше третьей инструкции мы резервируем определенные "байты" пространства для стека. Из doc %rsp - 64-разрядный регистр, а %esp-32-разрядный.

Означает ли "$32 " 32 байта ?($число означает константу ?) Если да, то как мы выделяем 32 байта на 64-битном регистре? Вышеприведенные инструкции были сгенерированы из "otool". Я использую macbook pro.

Я просто пытаюсь узнать кое-что о сборке.

Спасибо.

2 4

2 ответа:

Означает ли "$32 " 32 байта ?($число означает константу ?) Если да, то как мы выделяем 32 байта на 64-битном регистре?

Эти 32 байта не выделяются на 64-битном регистре. Они распределяются по стеку. При понижении stackpointer (который находится в %rsp) диапазон адресов от %rsp до %rsp+31 находится в нашем распоряжении для хранения данных.

В 64-битном коде для вас уже зарезервировано 128 байт, поэтому вам не нужно возиться с указателем стека в листовых функциях, что, следовательно, означает, что вам, вероятно, не нужно нажимать/pop %rbp. Просто использовать %РСП-128 в %РСП-1 для вашего сведения.

Эта зарезервированная область называется красной зоной :

Http://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64/