簡體   English   中英

匯編函數調用會導致所有寄存器都被壓入堆棧嗎?

[英]Does the assembly function call cause all registers to be pushed onto the stack?

我對執行Visual C ++的匯編代碼的call指令執行時會發生什么感興趣。 我認為發生的情況是調用指令本身將所有上下文推送到堆棧(注冊內容,PC等)並更新PC。 但是話又說回來,我想知道是否所有上下文都被推送。 在許多情況下,並非所有寄存器都在所調用的函數內使用。 編譯器是否檢測到這一點,只推送了由函數修改的上下文,還是在硬件級別上廉價地實現了所有上下文,以至於它總是可以完成?

這一切都取決於ABI( 應用程序二進制接口 ),它決定了調用者還是被調用者將事物壓入堆棧。 由於您未指定平台(盡管Visual Studio暗示x86),所以答案取決於。

通常,調用者無法知道被調用函數將執行的操作,因此編譯器無法基於函數內部的信息進行優化。

通常,在任何平台上都不會自動執行將上下文推入堆棧的操作,但是某些平台具有宏和經過優化的指令可以快速執行此操作。 通常,唯一會自動從堆棧中彈出的東西就是PC。

編輯:對於x86,有幾個ABI。 您應該查看此Wiki參考以查看所有內容(cdecl,stdcall等)。 關於調用者還是被調用者保存上下文,每個都有不同的規則。

指令CALL不會將寄存器壓入堆棧。 它僅將函數應返回的地址壓入。

INT指令(其作用類似於調用)也將FLAGS寄存器的內容壓入。

如果程序在函數調用期間需要保留其他一些寄存器,則需要通過顯式 push指令將這些寄存器存儲在堆棧中,然后通過pop指令將其恢復。

當我們談論高級語言時,存儲什么以及確切存儲方式僅取決於編譯器。 編譯器可以自由使用任何約定,但是通常它們遵循標准約定,以便提供鏈接以不同語言編寫的模塊的功能。

在匯編編程中,保留策略完全取決於程序員。 他可以根據自己的編程目標來使用某些標准約定或自定義約定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM