我读到,当程序进行函数调用时,被调用的函数必须知道如何返回其调用者。
我的问题是:被调用的函数如何知道如何返回其调用者?是否有一种机制通过编译器在幕后工作?
编译器遵循特定的“调用约定”,该约定定义为您所针对的 ABI 的一部分。该调用约定将包括一种让系统知道要返回哪个地址的方法。调用约定通常利用硬件对过程调用的支持。例如,在 Intel 上,返回地址被推送到堆栈:
...处理器推动的值EIP
寄存器(其中包含以下指令的偏移量)CALL
指令)在堆栈上(稍后用作返回指令指针)。
从函数返回是通过ret
操作说明:
...处理器将返回指令指针(偏移量)从堆栈顶部弹出到EIP
寄存器并在新的指令指针处开始程序执行。
相比之下,在 ARM 上,返回地址放入链接寄存器中:
The BL
and BLX
指令将下一条指令的地址复制到lr
(r14
,链接寄存器)。
返回通常通过执行来完成movs pc, lr
将地址从链接寄存器复制回程序计数器寄存器。
参考:
- 英特尔软件开发人员手册 http://www.intel.com/products/processor/manuals/
- ARM 信息中心 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/Cihfddaf.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)