2016-05-29 2 views
0

В стеке вызовов у нас есть указатель на фрейм, который дает нам расположение аргументов для процедуры и адрес указателя на предыдущий кадр. У нас также есть обратный адрес. Зачем нужен обратный адрес? Не могли бы мы просто следовать указателям фрейма в стек, выталкивая фреймы стека, когда мы шли? Является ли обратный адрес просто оптимизацией?Зачем нам нужен обратный адрес?

+0

Обратный адрес содержит адрес инструкции для возврата. Это иначе не хранится нигде. – Jester

+0

Указатель на раму - это, как правило, предыдущие указатели стека. Обратный адрес является указателем предыдущей инструкции. –

+0

Кадр необязательный, указатель кадра необязателен, обратный адрес не является необязательным. Также сильно оптимизирован внутри процессора для улучшения предсказания ветвления. –

ответ

2

Обратный адрес не указывает на предыдущий стек кадра, он указывает на сегмент кода следующей инструкции в вызывающем методе.

+0

«В сегмент кода» -> Это то, что напомнило мне, что мой сон лишил мозг того, насколько я был глуп. Благодаря! –

0

Кадр указывает на пространство для хранения параметров и локальных переменных. Вы можете привести это в исходное состояние, но это не приведет к восстановлению указателя инструкции, старое значение которого было потеряно при вызове функции.

Обратный адрес - это только что сохраненный указатель инструкции.

1

Обратный адрес относится к адресу сегмента кода или инструкции, вызов функции которой создал этот стек. Это очень важные данные в соответствии с уязвимостями, так как в случае переполнения буфера злоумышленники получают адресное пространство, которое может привести к компрометации состояния

Смежные вопросы