Что происходит со значением обратного адреса при вызове новой функции

Представьте себе этот код

int main()
{
f();
}

void f() { g(); }
void g() { cout << "hello" << endl; }

Когда вызывается f, в регистре RA (обратный адрес) хранится адрес в main, с которого был вызван f (f, чтобы знать, куда переходить, когда заканчивается). Когда f вызывает g, он должен установить RA для адреса в f, g, чтобы знать, куда возвращаться. Так как это сделать? Хранит ли RA для f во временном месте или что-то еще, чтобы не перезаписывать старое значение?

Благодарю.

0

Решение

Без каких-либо оптимизаций, обычный процесс в вашем примере:

  • main () — отправить адрес возврата в «стек», вызвать f ().
  • f (): нажать обратный адрес, вызвать g ().
  • g (): распечатать, затем выдать обратный адрес и перейти в счетчик программы
    регистр.
  • f (): выдать обратный адрес, перейти в счетчик программы
  • main (): конец программы.

Это теория. Ваш компилятор может выдавать другой код.

Изменить 1:
Для точной информации скажите вашему компилятору распечатать язык ассемблера.

0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector