【问题标题】:What happens with return address value when new function is called调用新函数时返回地址值会发生什么
【发布时间】:2015-10-16 21:34:24
【问题描述】:

想象一下这段代码

int main()
{
    f();
}

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

当 f 被调用时,在 RA(返回地址)寄存器中存储调用 f 的 main 中的地址(f 知道在完成时跳转到哪里)。 f 调用 g 时,应该设置 RA 为 f 中的地址,g 知道返回到哪里。那么这是怎么做到的呢?是否将 f 的 RA 存储在临时位置或其他地方,而不是覆盖旧值?

谢谢。

【问题讨论】:

  • 哪个编译器?这是 100% 实现定义的,与 C++ 语言几乎没有关系。我认为答案是“堆栈帧”。
  • 我认为堆栈帧中存储的是返回值,而不是地址(否则RA寄存器将毫无意义)
  • 嗯,我不知道你还期望它如何工作
  • 使用你的编译器打印出汇编语言列表。

标签: c++ operating-system kernel return-value cpu-registers


【解决方案1】:

没有任何优化,你的例子中的通常过程:

  • main() - 将返回地址压入“堆栈”,调用 f()。
  • f():推送返回地址,调用g()。
  • g():打印,然后弹出返回地址并移入程序计数器 注册。
  • f():弹出返回地址,移入程序计数器
  • main():结束程序。

这是理论。您的编译器可能会发出不同的代码。

编辑 1:
有关确切的细节,请告诉您的编译器打印汇编语言。

【讨论】:

  • 那么RA寄存器是什么意思?
  • 不知道。英特尔上不存在。 ARM 上最近的是链接寄存器 R14。
  • 你用的是什么处理器?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 2014-11-11
  • 2013-09-17
  • 1970-01-01
  • 2017-05-29
相关资源
最近更新 更多