Насколько я понимаю, указатель стека указывает на «свободную» память в стеке, а «толкание» данных в стеке записывается в местоположение, указанное указателем стека, и увеличивает/уменьшает его.Не указывает ли указатель на фреймворк указателя стека?
Но нельзя ли использовать смещения от указателя рамки для достижения того же, сохраняя при этом регистр. Накладные расходы, связанные с добавлением смещений в указатель фрейма, в значительной степени совпадают с накладными расходами приращения и уменьшения указателя стека. Единственное преимущество, которое я вижу, - это доступ к данным из «верхней» (или нижней), будет быстрее, если это не операция push или pop, например. просто чтение или запись на этот адрес без увеличения/уменьшения. Но опять же, для таких операций потребуется один дополнительный цикл, используя указатель кадра, и будет использоваться один дополнительный регистр для общего использования.
Похоже, что нужен только указатель кадра. И это даже требует гораздо большей цели, чем просто модификация данных в текущем фрейме стека, например, для использования в отладке и для разворачивания стека. Я что-то упускаю?
Предположим, что у вас есть только указатель кадра и вызывается подпрограмма. Как эта подпрограмма узнает, где начинается ее собственный кадр? Или что делать, если обработчик сигнала должен быть выполнен или что-то, что нужно знать о текущих ограничениях стека? На практике это указатель кадра, который опущен, а не указатель стека. – Jester
@Jester - при вызове подпрограммы указатель кадра настраивается и затем восстанавливается в кадр местоположения вызова? Предел стека может быть также рассчитан с помощью указателя кадра, если FP + смещение доступа> размер стека вы уходите. –
Только вызывающий пользователь знает размер кадра, и если он корректирует указатель кадра, он эффективно превращается в указатель стека. – Jester