假設我們有一個C(或C++)具有以下簽名功能:Win64 vs System V ABI(x86_64):Win64跳過註冊?
void foo(int64_t a, double b, int64_t c, double d);
當在Linux,Mac,或者使用System V的ABI(x86_64的)任何OS編譯,a
和c
獲得通過的rdi
和rsi
寄存器,b
和d
通過xmm0
和xmm1
。好的,這沒什麼不妥。但是,我在Windows(x86_64)中也是這樣做的,它看起來像跳過了一些寄存器。 a
和c
在rcx
和r8
獲得通過(rdx
跳過),以及b
和d
獲得通過在xmm1
和xmm3
(xmm0
和xmm2
跳過)。爲什麼Win64會這樣做而不是「壓縮」像System V這樣的參數?對於System V,我想象能夠傳遞4個qwords和4個雙打而不需要傳遞堆棧中的任何東西,而我猜測Win64會傳遞任何東西超過堆棧中的第4個參數。
我知道在Win64與SysV中傳遞參數時寄存器順序的差異,但順序應該不相關。我只是好奇爲什麼Win64會跳過寄存器,特別是當它只有4個非棧參數傳遞。
完全不同的abi,我認爲我認爲老勝abi被稱爲fastcall不知道約64位...我只知道它是不同的... –
這有點難以回答,我們可以推測,但在最後只有設計師*真的*知道他們的理由 – harold
請注意,Win64 ABI在寄存器中傳遞最多四個整數/指針參數,而System V ABI傳遞多達六個寄存器(請參閱https://en.wikipedia.org/維基/ X86_calling_conventions)。在Win64中用於這個目的的四個都是System V中使用的六個。我不認爲說Win64 ABI *跳過*寄存器是不合適的,但肯定指定它們中的更少用於使用。至於爲什麼它這樣做,但是,我懷疑你會在這裏得到解釋。 –