Резерв байтов в стеке: сборка x86 (64 бит)
pushq %rbp
movq %rsp, %rbp
subq $32, %rsp
У меня есть большой вопрос относительно объяснения "$32" в третьей инструкции. Информация из поиска и блогов указывает, что в приведенной выше третьей инструкции мы резервируем определенные "байты" пространства для стека. Из doc %rsp - 64-разрядный регистр, а %esp-32-разрядный.
Означает ли "$32 " 32 байта ?($число означает константу ?) Если да, то как мы выделяем 32 байта на 64-битном регистре? Вышеприведенные инструкции были сгенерированы из "otool". Я использую macbook pro.
Я просто пытаюсь узнать кое-что о сборке.
Спасибо.
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/