回答
编译器遵循特定的“调用约定”,该约定被定义为您定位的ABI的一部分。该调用约定将包括系统知道要返回的地址的方式。调用约定通常利用硬件对程序调用的支持。英特尔,例如,返回地址被压入堆栈:
...处理器推动
EIP
寄存器的值(其中包含CALL
指令之后的指令的偏移量)在栈上(稍后用作返回指令指针)。...处理器从堆栈中弹出的顶部返回指令指针(偏移)到
EIP
寄存器并且开始:从函数返回经由
ret
指令完成程序在新的指令指针处执行。
对比,对ARM,返回地址被放入链接寄存器:
的
BL
和BLX
指令复制下一条指令的地址为lr
(r14
,链接寄存器)。
返回通常通过执行movs pc, lr
将地址从链接寄存器复制回程序计数器寄存器来完成。
参考文献:
这是由叠层(尤其是在Intel样系统)成为可能。假设我们有一个方法caller
,它包含了一个本地保存的int
。
当caller(
调用target(
int必须保存。它被放置在堆栈上,以及呼叫的地址。 target(
可以执行其逻辑,创建自己的局部变量,并调用其他方法。它的局部变量将与电话的地址一起放入堆栈。
当target(
结束时,堆栈被“展开”。包含target(
的局部变量的堆栈顶部被删除。
当方法递归太多时,堆栈可能会变得太大,并且可能发生“堆栈溢出”。
编译器知道如何调用函数以及使用哪种调用约定。例如在C中,函数的参数被压入堆栈。调用者负责清除堆栈,所以被调用的函数不必删除参数。其他调用约定可以包括将参数推入堆栈,被调用函数必须清除它。在这种情况下,生成的代码是这样的,函数可以在返回之前纠正堆栈。 Ohter调用约定可能将参数传递到寄存器中,因此在这种情况下,被调用函数也不必小心。
CPU有调用子程序的机制。这会将当前执行地址存储在堆栈上,然后将处理转移到新地址。当函数完成时,它执行一个return语句,它将获取调用者地址并在那里恢复执行。
如果返回地址被破坏,因为堆栈没有正确清理uo,或者内存被覆盖,那么你会得到未定义的行为。当然,具体的实施细节取决于所使用的平台。
它需要被叫方和主叫方之间的合作。
主叫方同意给被叫方返回给被叫方的地址(通常通过将其推入堆栈或通过将其传送到注册表中),并且被叫方同意在完成时返回到该地址执行。
- 1. 从被调用者返回(终止)调用者函数
- 2. 如何将回调函数的值返回给调用者?
- 3. Jquery:将ajax调用的值返回给调用者函数?
- 4. Facebook.addJSEventListener回调函数不被调用
- 5. KeyboardProc回调函数没有被调用?
- 6. jsonp回调函数没有被调用
- 7. SSL_CTX_set_tlsext_servername_callback回调函数没有被调用
- 8. 为什么回调函数被调用?
- 9. 如何使用被调用函数的返回数据?
- 10. 调用者/被调用者不匹配签名的gcc函数调用语义
- 11. Ajax调用不被返回
- 12. JS:如何使用返回类型的回调函数来返回主被调用函数
- 13. Android - 有没有在onResume()之后被调用的回调函数?
- 14. nodejs等待被调用的函数http请求完成之前从被调用者返回
- 15. 方法返回href被调用ng-href被调用
- 16. 如何AudioUnitRender回调被调用在iphone
- 17. PHPUnit - 如何测试回调被调用?
- 18. 回调没有被调用
- 19. Async.waterfall:回调已被调用?
- 20. 发送数据返回给调用者
- 21. 如何创建一个调用者/被调用者图?
- 22. 如何在Firebase调用其回调函数后返回main_thread?
- 23. 被调用者是否可以强制其调用者在python中返回?
- 24. 处理调用者或被调用者的数据?
- 25. 如何访问被调用的函数?
- 26. C18:被调用的函数被跳过
- 27. 函数不会被调用
- 28. 函数没有被调用
- 29. javascript函数不被调用
- 30. ManagedBean函数不被调用
您应该阅读[this](http://en.wikipedia.org/wiki/Call_stack#Structure)这是非常好的答案:[Chapter 11 - Procedures](http://pages.cs.wisc。 edu /〜smoler/x86text/lect.notes/procedures.html)如果你喜欢视频:[黑客组装入门(第11部分)函数栈](http://www.progamercity.net/code-tut/168- assembly-language-primer-hackers-video-series.html)你会喜欢这里的所有视频。 –