![](/img/trans.png)
[英]C++/Assembly pushing arguments onto the stack for function call
[英]Does the assembly function call cause all registers to be pushed onto the stack?
我對執行Visual C ++的匯編代碼的call
指令執行時會發生什么感興趣。 我認為發生的情況是調用指令本身將所有上下文推送到堆棧(注冊內容,PC等)並更新PC。 但是話又說回來,我想知道是否所有上下文都被推送。 在許多情況下,並非所有寄存器都在所調用的函數內使用。 編譯器是否檢測到這一點,只推送了由函數修改的上下文,還是在硬件級別上廉價地實現了所有上下文,以至於它總是可以完成?
指令CALL
不會將寄存器壓入堆棧。 它僅將函數應返回的地址壓入。
INT
指令(其作用類似於調用)也將FLAGS
寄存器的內容壓入。
如果程序在函數調用期間需要保留其他一些寄存器,則需要通過顯式 push
指令將這些寄存器存儲在堆棧中,然后通過pop
指令將其恢復。
當我們談論高級語言時,存儲什么以及確切存儲方式僅取決於編譯器。 編譯器可以自由使用任何約定,但是通常它們遵循標准約定,以便提供鏈接以不同語言編寫的模塊的功能。
在匯編編程中,保留策略完全取決於程序員。 他可以根據自己的編程目標來使用某些標准約定或自定義約定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.