Стек вызовов говорит не «откуда вы пришли», а «куда вы собираетесь дальше»?

В предыдущем вопросе ( Получить иерархию вызовов объектов ) я получил этот интересный ответ :

Стек вызовов не указывает, где вы пришли из. Он сообщает вам, куда вы собираетесь двигаться дальше.

Насколько я знаю, при вызове функции программа обычно выполняет следующие действия:

  1. В вызывается код :

    • сохранить адрес возврата (в стеке вызовов)
    • сохранить состояния регистров (в стеке вызовов)
    • записать параметры, которые будут переданы функции (в стеке вызовов или в регистрах)
    • перейти к целевой функции

  2. В вызываемый целевой код:

    • Получить сохраненные переменные (при необходимости)

  3. Процесс возврата : отменить то, что мы сделали, когда вызывали функцию, т.е.развернуть / открыть стек вызовов:

    • удалить локальные переменные из стека вызовов
    • удалить функциональные переменные из стека вызовов
    • восстановить состояние регистров (тот, который мы сохранили ранее)
    • перейти к адресу возврата (тот мы хранили раньше)

Вопрос:

Как это можно рассматривать как нечто, что «сообщает вам, куда вы собираетесь идти дальше» , а не «сообщает вам, откуда вы пришли» ?

Есть ли что-то в среде исполнения C # или JIT C #, что заставляет этот стек вызовов работать по-другому?

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

15
задан Community 23 May 2017 в 12:08
поделиться