📌  相关文章
📜  当我们调用函数时会发生什么

📅  最后修改于: 2021-09-03 03:57:17             🧑  作者: Mango

函数是一组执行特定任务的代码,只需调用即可在需要时使用。

当使用多个函数调用或者递归函数调用的概念是非常必要的是已知的,为了更好地理解代码。

现在,让我们了解函数调用的工作原理

在理解函数调用的工作原理之前,您需要了解一些关于 CPU 中程序执行、程序堆栈、堆栈帧(激活记录)的先决知识。

  • 程序堆栈:程序堆栈是保存所有函数调用的堆栈,底部元素作为主函数。
  • 栈帧:栈帧实际上是一个缓冲存储器,它是程序栈的一个元素,具有被调用函数的数据,即
    • 退货地址
    • 输入参数
    • 局部变量
    • 注册储蓄
  • 堆栈指针:堆栈指针是指向程序堆栈顶部的指针,即最近调用的函数。

现在,每当调用一个函数时,都会创建一个包含所有函数数据的新堆栈帧,并将该堆栈帧压入程序堆栈,并且始终指向程序堆栈顶部的堆栈指针指向压入的堆栈帧。在程序堆栈的顶部。

我们调用函数时的一系列操作:

  1. 堆栈 帧被压入堆栈。
  2. 执行子程序指令。
  3. 堆栈帧从堆栈中弹出。
  4. 现在程序计数器持有返回地址。

注意:汇编语言中的 POP 指令移除栈顶并将其分配给程序计数器。

让我们借助一个例子来理解:

在上面调用函数的实例中。

  1. 程序计数器在执行函数之前指向下一条指令内存位置,即 104,而 100 是调用函数的内存位置。
  2. 为了恢复返回地址,程序计数器的内容被压入堆栈。现在存储在栈顶的地址是 104。
  3. 调用函数执行:现在程序计数器指向2000,即子程序的起始地址。子程序中所有后续指令执行完毕后,从堆栈中弹出该地址。
  4. 堆栈弹出是指移除堆栈顶部并分配给程序计数器。现在程序计数器持有返回地址,即 104。

本文背后的主要动机是了解在堆栈中推送返回地址背后的原因。然而,在函数的现代实现中,仅将返回地址推入堆栈是不够的。在推送返回地址之前,我们需要推送实参和形参。

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live