Как родительская функция знает, как перестраивать себя? Необходимые шаги, встроенные в вызов и ret?
blockquote>Перед вызовом функции сохраняется текущее состояние регистров, а также адрес возврата. Команда
call
переходит к конкретному адресу, где начинается вызываемая функция. Обратный адрес помещается в стек. Когда вызываемая функция возвращается, командаret
появляется ранее, толкает обратный адрес и переходит в это место.Затем rsp всегда перемещается в rbp
blockquote>. rbp ранее помещается в стек, чтобы иметь возможность восстановить значение rbp из функции вызывающего. Затем rsp перемещается в rbp для создания нового фрейма стека для функции calllee. Создан новый указатель базы. Таким образом, в настоящее время rbp и rsp указывают на одни и те же адреса. Если есть другие инструкции
push
, esp автоматически настраивается. Когда функция выполнена, командаpop ebp
восстанавливает ранее введенный адрес указателя на базовый указатель стека.