什么是呼叫说明

What are Call Instructions

本文关键字:说明 呼叫 什么      更新时间:2023-10-16

我目前正在阅读"编程:使用C++的原则和实践",作者提到在类定义中编写成员函数的定义可以使函数内联。我不完全确定这意味着什么,所以我在 https://www.geeksforgeeks.org/inline-functions-cpp/上寻找更具体的理解。我似乎无法理解这句话的上下文中的"指令"是什么意思:

当程序执行函数调用指令时,CPU 在函数调用之后存储指令的内存地址。

我用谷歌搜索了一下,看起来调用指令只是传递程序的另一部分或其他应用程序的控制权。如果这就是他们的意思,他们不应该说"CPU存储函数调用的调用指令的内存地址"吗?

这个问题可能听起来很奇怪或吹毛求疵,但我是CS的新手,真的很想对CS有一个扎实的了解。

它们实际上意味着存储函数调用后指令的内存地址。这是因为指令在机器代码级别的工作方式。函数调用完成后,程序需要一种方法来返回到原来的位置。它通过跳转指令到存储的内存地址来实现这一点,这会导致执行跳转到该指令。如果内存地址指向函数调用,它将永远循环。

首先,您链接到的页面正在讨论特定类别系统上的行为。它不是在描述标准C++。

该页面讨论的是汇编语言中可能由C++编译器生成的情况。"函数调用指令"是指执行函数调用的汇编语言(或机器码(指令。 在x86语法中,该指令call。例。

您可以通过搜索"x86 调用指令"或类似术语来查找有关此内容的更多信息。

被存储的地址,通常称为返回地址,是call之后下一条指令的地址。当函数的执行到达ret程序集指令时,执行将跳转到返回地址。

不,它所说的(这是x86芯片特有的,其他人可能会以不同的方式做(是CPU在调用之后存储指令的地址(在堆栈的顶部(,然后跳转到作为调用指令的操作数的地址。当被调用的函数执行"ret"指令时,存储的地址被读取,执行跳转到该点。

当执行 x86 CALL 指令时,程序计数器的内容(即 CALL之后的指令地址(存储在堆栈中,程序控件被转移到子例程中。

(x86 的程序计数器寄存器 (IP/EIP/RIP( 通常不能直接访问,但它被定义为在当前指令正在执行时指向下一条指令。

在完成子例程的执行后,执行RET指令,该指令将堆栈内容(即CALL指令之后的指令地址(加载回程序计数器。

因此,在调用方的指令中恢复执行call