Эта команда
lea 0x0(%rip),%rax
сохраняет адрес строкового литерала в регистре rax
.
И эта команда
mov %rax,-0x8(%rbp)
копирует адрес из регистр rax
в выделенную память стека. Адрес занимает 8 байт, как видно из смещения в стеке -0x8
.
Это хранилище вообще происходит только потому, что вы скомпилировали его в режиме отладки; это обычно было бы оптимизировано далеко. Следующее, что происходит, это то, что локальные переменные (в красной зоне ниже указателя стека) эффективно отбрасываются, так как функция разрушает свой кадр стека и возвращает.
Материал, который вы Вы, вероятно, рассматриваете включенный sub $16, %rsp
или аналогичный для выделения места для местных жителей ниже RBP, затем освобождаете это пространство позже; ABI System V системы x86-64 не нуждается в этом в конечных функциях (которые не вызывают никаких других функций); они могут просто использовать зону чтения. (См. Также Где именно находится красная зона на x86-64? ). Или скомпилируйте с gcc -mno-red-zone
, который вы, вероятно, в любом случае захотите для автономного кода: Почему код ядра не может использовать красную зону
Затем он восстанавливает сохраненное значение RBP вызывающего абонента (который был ранее установлен как указатель кадра; обратите внимание, что пространство для локальных адресов было адресовано относительно RBP).
pop %rbp
и завершает работу, фактически вставляя адрес возврата в RIP
retq