2010-01-15 31 views
5

X86_64 derleme kodundan C çağrısına çağrı çağrısını kullanarak ve diğer çağrı kurallarıyla bir aramayı sağlayan bir arabirim (örneğin, bir sarıcı) yapıyorum. En iyi şey, "derleyici bağımsız" olmaktır (sarıcıyı değiştiren juste), bu yüzden derleyicide geri yığınlar/yığın şeyler koyan bir şey arıyorum. Zaten buraya baktım: Custom calling convention for P/Invoke and C# ve yapmam gerekenden çok yakın. Şu anda, GCC kullanıyorum ama diğer derleyicilerden ipuçları bekliyoruz!Özel X86_64 C işlev çağrısı için çağrı çağrısı

Yani, burada bir şey sorunun en iyi görünüm için, olduğu (özel kodlama kuralı garip):

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 

Ben "özel" (sarıcı) C işlevi çağırmak için gerekiyor ; Burada iş diğer C işlevleri arasında çağrı göndermek olacaktır. Bu yüzden bu paketin% r11'i bulması, tüm kayıtları kaydetmesi ve daha fazla çağrı için yığını hazırlaması gerekiyor. Bunu C dilinde yapmak için uygun bir yol var mı?

Teşekkür kuralları çağıran ve nasıl ilgili belgeler için bir sürü

+0

Visual C++, derleyicinin prologue ve epilogue oluşturmasını engelleyen bir '__declspec (çıplak)' değiştiricisine sahiptir. X64 hedefleri (ve satır içi montaj da) için derleme sırasında –

+0

__declspec (çıplak) desteklenmez. – Andrey

cevap

3

Agner Fog's document de bakabilirsiniz bir işleve geçirilen parametre (? Yığını vb nelerin kayıtlarda?) Bulunmaktadır.

Daha sonra, nasıl yaptıklarını görmek için libffi adlı kaynağın kaynak kodunu inceleyebilirsiniz.

+0

Yanıtladığınız için teşekkür ederiz; Libffi'yi bilmiyordum, bunu kontrol edeceğim, ses harika. – Matthieu

+0

Eğer senin yerinde olsaydım, mümkünse, libffi'ye güvenirdim. Kararlı, bakımı yapılmış ve birçok köşe kasasını ele alıyor. –

+0

Tamam, Agner Fog'un dokümanı çok faydalı. Ancak libffi, tüm kayıt defterlerini, özellikle YMM kayıtlarını (henüz değil?) Kaydetmez. Bu arada, bununla bazı şeyler yapabilmem gerekir! Çok teşekkürler. – Matthieu