2010-01-15 12 views
5

मुझे एक इंटरफ़ेस (कहना है, एक रैपर) करना है जो अन्य कॉलिंग कन्वेंशन के साथ अपने कॉलिंग कन्वेंशन का उपयोग करके X86_64 असेंबली कोड से कॉल को अनुमति देता है। सबसे अच्छी बात यह है कि सुंदर "कंपाइलर स्वतंत्र" (केवल रैपर को संशोधित करने वाला) होना चाहिए, इसलिए मैं कुछ ऐसा ढूंढ रहा हूं जो संकलक/स्टैक सामान को कंपाइलर पर वापस रखे। मैं पहले से ही यहां देख रहा हूं: Custom calling convention for P/Invoke and C# और यह मुझे जो करना है उससे करीब आ गया है। वर्तमान में, मैं जीसीसी का उपयोग कर रहा हूं, लेकिन अन्य कंपाइलरों से संकेतों का स्वागत है!कस्टम X86_64 कॉलिंग कन्वेंशन को सी फंक्शन कॉल

तो, यहाँ बात है, समस्या का एक सबसे अच्छा दृश्य के लिए है (कस्टम कोडिंग सम्मेलन अजीब बात है):

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 

मैं एक "विशेष" (आवरण) सी समारोह कॉल करने के लिए सक्षम होना चाहिए ; यहां नौकरी अन्य सी कार्यों के बीच कॉल प्रेषित करने के लिए होगा। इसलिए इस रैपर को% r11 खोजने, सभी रजिस्टरों को सहेजने और आगे कॉल के लिए स्टैक तैयार करने की आवश्यकता है। सी में ऐसा करने का कोई सही तरीका है (कुछ इनलाइन एएसएम के साथ)?

धन्यवाद एक बहुत

+0

विज़ुअल सी ++ में '__declspec (नग्न) 'संशोधक है जो संकलक और उपनिवेश उत्पन्न करने से संकलक को रोकता है। –

+0

__declspec (नग्न) x64 लक्ष्यों (और इनलाइन असेंबली भी) के लिए संकलित करते समय समर्थित नहीं है। – Andrey

उत्तर

3

सम्मेलनों बुला और कैसे के बारे में दस्तावेज़ीकरण के लिए पैरामीटर एक समारोह के लिए पारित (रजिस्टरों में? जो? क्या ढेर आदि पर है) Agner Fog's document पर एक नजर है कर रहे हैं।

फिर, आप libffi के स्रोत कोड पर देख सकते हैं कि वे यह कैसे करते हैं।

+0

उत्तर देने के लिए धन्यवाद; मुझे libffi नहीं पता था, मैं यह जांचने वाला हूँ, यह बहुत अच्छा है। – Matthieu

+0

यदि मैं संभव था, यदि मैं संभव था, तो मैं सिर्फ libffi पर भरोसा करता हूं। यह स्थिर, रखरखाव और कई कोने के मामलों को संभालता है –

+0

ठीक है, एग्नेर कोहरे का दस्तावेज़ बहुत उपयोगी है। लेकिन libffi सभी रजिस्टरों को नहीं बचाता है, विशेष रूप से वाईएमएम रजिस्टरों (अभी तक नहीं?)। वैसे, मैं इसके साथ कुछ सामान करने में सक्षम होना चाहिए! बहुत बहुत धन्यवाद। – Matthieu

संबंधित मुद्दे