2011-10-26 34 views
1

據我所知,x64代碼Microsoft x64AMD64有兩種可能的調用約定。海灣合作委員會x64函數調用

現在,gcc可以與-mregparm=0參數一起啓動,如果我們正在使用AMD64調用約定,則該參數不起作用。 發生這種情況是因爲AMD64約定要求使用寄存器的前6個變量(我不太確定爲什麼這樣做,但我懷疑它是由於可能的堆棧安全問題而執行的)。

所以,這裏的問題:

是否有這樣的(強制寄存器使用)一些嚴格的規定使用gccMicrosoft x64約定編譯時?而且,如果是的話,他們如何在不破壞兼容性的情況下繞過?

回答

3

我不知道的Microsoft Windows(和從來沒有使用過),所以我可能不能回答你的問題了。

但是,AMD64應用程序二進制接口調用約定(在Linux和其他Unix上)記錄在AMD64 ABI spec(也許您應該可以找到並閱讀Microsoft調用約定的等效文檔)。我相信他們使用寄存器作爲6個第一個參數,因爲性能方面的考慮(通過寄存器傳遞值比在棧上傳遞更快),這不是出於安全考慮。不管你使用哪種C++編譯器,你都希望它遵循一些調用約定,而這些實際上是由系統決定的(因爲你希望能夠從你的代碼中調用系統庫)。所以如果你打破它們,你會打破ABI的兼容性。

但我猜不出爲什麼要問這樣一個問題。你是用自己的調用約定開發一個編譯器嗎?如果是的話,你仍然應該有一些方法來調用C庫,並且這需要調用外部C庫時遵循ABI約定。查看Ocaml編譯器的示例。

+0

*只是很好奇*我一直在爲'x64'平臺做一些優化研究,並希望通過調用約定來解決某些誤解。 –

3

我不認爲你可以繞過這些沒有打破ABI。函數調用以及如何影響寄存器等是平臺ABI的基礎部分。

由於函數調用ABI不匹配,您的程序可能無法在Windows x64上運行。

對於所有你能想到的文檔,請參閱this MSDN link

+0

我想你是對的。然而,*(僅僅爲了解我)* - 'MS64約定'是否具有與強制使用寄存器相同的規則(如'AMD64')?或者在'MS64'中,您可以自由選擇堆棧和寄存器嗎? –

相關問題