मुझे एक इंटरफ़ेस (कहना है, एक रैपर) करना है जो अन्य कॉलिंग कन्वेंशन के साथ अपने कॉलिंग कन्वेंशन का उपयोग करके 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 खोजने, सभी रजिस्टरों को सहेजने और आगे कॉल के लिए स्टैक तैयार करने की आवश्यकता है। सी में ऐसा करने का कोई सही तरीका है (कुछ इनलाइन एएसएम के साथ)?
धन्यवाद एक बहुत
विज़ुअल सी ++ में '__declspec (नग्न) 'संशोधक है जो संकलक और उपनिवेश उत्पन्न करने से संकलक को रोकता है। –
__declspec (नग्न) x64 लक्ष्यों (और इनलाइन असेंबली भी) के लिए संकलित करते समय समर्थित नहीं है। – Andrey