彙編中引數如何用堆疊傳遞?

時間 2021-10-18 19:52:55

1樓:方彥

這取決於你要編寫的架構,和你打算遵守的呼叫約定。

例如假如你希望在X86平台上遵守cdecl,即呼叫者從最右邊的引數開始,依次將引數壓棧,在被調方執行完畢後,將返回值寫入EAX,然後返回,由呼叫者將引數彈出,實現棧的平衡。

假如你希望用stdcall,這是X86上Windows API的預設呼叫方式。呼叫方將引數從右到左壓入,被調方返回時將返回值寫入EAX,被調方將引數乙個個彈出,然後返回。很明顯,這一方法有乙個缺點,那就是不支援可變引數,因為需要彈出多少個引數已經寫在了函式裡(當然,函式如果是彙編寫的,可以自己手動決定彈出多少引數,但C語言不能控制到這一點)。

現在在主流的平台,x86-64上,一般使用的是fast call,即將前四個引數依次儲存在RCX、RDX、R8D、R9D中,然後將後面的引數(如果有的話)壓棧,返回時由被調方實現棧平衡。

但如果你希望呼叫已被編譯的C函式,你就需要了解那個C函式遵守什麼呼叫約定,然後依照呼叫約定去呼叫它。

c語言的引數傳遞和返回值,如何從彙編角度來理解他們的不同之處?

僅從彙編角度來說,沒有區別,甚至沒有傳參和返回值這個概念。你可以自行決定使用堆疊或暫存器來傳遞,簡單點講,往暫存器裡丟個東西,只要不清零或重寫,任何時候你都可以使用它。所謂的返回值也可以不止乙個,想返回什麼就把什麼丟到任何乙個或多個暫存器裡,乙個暫存器存不下可以用多個。所謂返回只是操作一下ip,有沒...

如何用VS2010設定編寫匯程式設計序的環境,求詳細解答以及為什麼?

陳良喬 應該很詳細了 Visual Studio自帶的模板是沒有寫ASM檔案的,因此我們需要換一種方法建立專案。具體做法是,在新建專案對話方塊中,選擇建立乙個VC 的空專案。將其命名為我們想要的名稱。之後,需要在新建的工程中選擇新增乙個原始檔,由於模板中沒有 asm檔案,因此,你可以隨便添乙個檔案,...

量化策略中,多引數穩定性如何評價?

法派銳士 對於m le 3m 3的CTA策略,由於涉及的計算並不是特別複雜,因此我們總是可以對引數進行窮舉式運算得到各種可能的業績值,這時候最主要的問題就是最優的業績是歷史偶然事件,還是真正我們所捕捉到的隨機結構?這個時候最核心的方法是看最優業績周圍的引數分布,如過周圍引數的業績是平滑和漸進的,那麼...