Задать вопрос
@kaktak255

Для чего класть в стек регистр в начале функции?

Для чего в начале каждой функции
push rbp
mov rbp, rsp

а в конце
pop rbp
  • Вопрос задан
  • 288 просмотров
Подписаться 1 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Конкретно эта последовательность помимо тупо сохранения rbp создаёт разметку кадров стека. Если все функции в цепочке вызовов делают так, то из любой функции можно проследить всю цепочку вызовов до неё зная только текущее значение rbp без какой бы то ни было дополнительной отладочной информации, потому что по адресу в rbp хранится rbp предыдущей функции, а по адресу rbp + 8 -- адрес возврата в предыдущую функцию. Но делать это, конечно же, необязательно. Например gcc вызванный с флагом -fomit-frame-pointer генерирует код без этой последовательности и использует rbp как ещё один регистр общего назначения.

Почему тогда все регистры не помещаются в стек?

Потому что есть документ называемый psABI, который определяет, какие регистры должна сохранять вызываемая функция. Например: x86_64 psABI, раздел 3.2.1 "Registers".
Ответ написан
Комментировать
Чтобы не портить жизнь тому, кто твою функцию вызвал и оставить все регистры в том состоянии, в каком они были до вызова
Ответ написан
Ваш ответ на вопрос

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

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