2012-03-20 27 views
7

EAX用於在32位平臺中存儲函數的返回值,我只是想知道函數返回值的大小是否大於4字節,eax如何處理它?在這種情況下,OS可以將返回值保存在堆棧中,並將堆棧的地址存儲在EAX中,但OS如何判斷存儲在EAX中的值是返回值的地址還是實際上是返回值本身?eax存儲返回值大於4字節的返回值如何?

+0

請參閱此問題的答案:http://stackoverflow.com/questions/2155730/how-do-c-compilers-implement-functions-that-return-large-structures – 2012-03-20 10:21:42

回答

12

調用者和被調用者必須就寄存器和堆棧包含的內容達成一致。這被稱爲calling convention,這是一個更大的概念稱爲application binary interface (ABI)的一部分。被調用者定義了它的調用方式(參數是否需要在堆棧中,寄存器等中),編譯器確保它生成的代碼符合調用約定。

至於你的具體問題,它取決於ABI。有時如果返回值大於4字節但不大於8字節,則可以將其分割爲EAX和EDX。但大多數時候調用函數只會分配一些內存(通常在堆棧上)並將指向該區域的指針傳遞給被調用的函數。

請注意,操作系統的作用並不像您想象的那麼重要。具有不同調用約定的二進制文件可以共存於同一個系統上,並且二進制文件甚至可以在內部使用不同的調用約定。操作系統的ABI只有在二進制調用其系統庫時纔是重要的。