我必須做一個接口(比如,一個包裝器),允許從X86_64彙編代碼使用他的調用約定調用C函數,與其他調用約定。最好的事情將是漂亮的「編譯器獨立」(正確修改封裝),所以我正在尋找一些東西,把寄存器/堆棧的東西放在編譯器上。我已經在這裏看到:Custom calling convention for P/Invoke and C#,它接近我所要做的。目前,我正在使用GCC,但歡迎來自其他編譯器的提示!自定義X86_64調用約定到C函數調用
所以,這裏的東西,對這個問題的最佳視圖(自定義編碼約定是怪):
pushq %r11 # saves r11 for call
movq 64bits_address %r11 # move a 64 bits address that points on a data structure
callq *8(%r11) # calls an address in the data structure
popq %r11 # restores %r11 ; return value is in the structure
我需要能夠調用「特殊」(包裝)C函數;這裏的工作將是調用其他C函數之間的調用。所以這個包裝需要找到%r11,保存所有的寄存器,並準備進一步調用堆棧。有沒有一個適當的方法來做到這一點在C(與一些內聯彙編)?
非常感謝
Visual C++有一個'__declspec(naked)'修飾符,用於防止編譯器生成序言和結尾。 – 2010-01-15 10:38:55
編譯x64目標(以及內聯彙編)時不支持__declspec(naked)。 – Andrey 2010-12-23 08:06:25