回答
編譯器遵循特定的「調用約定」,該約定被定義爲您定位的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)你會喜歡這裏的所有視頻。 –