@whyamiscott

Для чего нужен этот участок кода?

В коде на ассемблере в начале описания функции встречается вот такой кусок кода, за что он отвечает?

.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
  • Вопрос задан
  • 2353 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Это организация кадра стека: pushq %rbp сохраняет текущий указатель кадра стека, movq %rsp, %rbp устанавливает новый.
Аннотации начинающиеся с .cfi_ управляют отладочной информацией, которой пользуются дебагер и механизм раскручивания стека при исключениях:
.cfi_startproc задаёт начало процедуры и устанавливает начальный регистр и смещение для расчёта адреса CFA (Canonical Frame Address).
.cfi_def_cfa_offset 16 обновляет смещение CFA, говоря, что оно стало равно 16 относительно заданного (директивой .cfi_startproc) регистра (%rsp).
.cfi_offset 6, -16 говорит, что теперь регистр 6 лежит по смещению -16 от CFA (таким образом была описана инструкция pushq %rbp).
.cfi_def_cfa_register 6 говорит, что теперь для расчёта адреса CFA используется регистр 6.

Подробности о .cfi_ можно найти в info as, а большую картину -- в главе 6.4 стандарта DWARF.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@vilgeforce
Раздолбай и программист
en.wikibooks.org/wiki/X86_Disassembly/Functions_an... - думаю оно

Только ассемблер у вас какой-то странный :-)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы