2013-02-05 41 views
8

Wikipedia के अनुसार इंटेल एबीआई EAX, ECX और EDX का उपयोग किसी फ़ंक्शन में संरक्षित किए बिना करने की अनुमति देता है।
मुझे यकीन नहीं है कि "इंटेल एबीआई" का क्या अर्थ है। क्या इसका मतलब यह है कि इंटेल सीपीयू को लक्षित करने वाले सभी कंपाइलर्स द्वारा इसे लागू/लागू किया जाता है? मैं एक असेंबली फ़ंक्शन लिख रहा हूं जिसे सी कोड से बुलाया जाएगा। क्या मैं इसे सभी कंपाइलरों के लिए मान सकता हूं? (मैं इस समय केवल x86 को लक्षित कर रहा हूं)फ़ंक्शन में उपयोग करने के लिए कौन से रजिस्ट्रार सुरक्षित हैं (x86)

उत्तर

6

इंटेल एबीआई इंटेल द्वारा स्थापित एक कॉलिंग सम्मेलन है।

सामान्य तौर पर, कैसे पैरामीटर पारित कर रहे हैं और जो रजिस्टरों बचाया या एक समारोह कॉल के दौरान ट्रैश किए जाते हैं समारोह के कॉलिंग सम्मेलन द्वारा परिभाषित किया गया है:

http://en.wikipedia.org/wiki/Calling_convention

__cdecl, __stdcall के लिए

विशेष रूप से और आप __fastcall ईएक्स, ईसीएक्स और ईडीएक्स को ट्रैश किए जाने की उम्मीद करनी चाहिए, और आपके फ़ंक्शन को अन्य रजिस्टरों को सुरक्षित रखना चाहिए और ईएक्स (या ईडीएक्स: 64-बिट रिटर्न के लिए ईएक्स) पर वापस जाना चाहिए।

यदि आपको नहीं पता कि आपको किस कॉलिंग सम्मेलन का उपयोग करना चाहिए, तो आपको असेंबली में लिखना नहीं चाहिए, क्योंकि कॉलिंग सम्मेलन को गड़बड़ करने से आपके आवेदन में शोषक बग हो सकता है।

सी में, डिफ़ॉल्ट कॉलिंग सम्मेलन सामान्य रूप से __cdecl है और विंडोज निर्यातित एपीआई के लिए यह सामान्यतः __stdcall है।

+0

मुझे कॉलिंग कन्वेंशन पता है जिसे मुझे उपयोग करने की आवश्यकता है, और इसका अर्थ यह है कि पैरामीटर के आदेश और स्टैक क्लीनअप के रूप में इसका अर्थ है। मुझे रजिस्टरों के बारे में पता नहीं था। क्या आप जानते हैं कि कौन से कंपाइलर्स इस एबीआई का पालन करते हैं? MSVC/जीसीसी? – baruch

+0

@baruch कम से कम एमएसवीसी के लिए, कॉलिंग सम्मेलन फ़ंक्शन प्रोटोटाइप में निर्दिष्ट है। कंपाइलर इसे देखता है और सही काम करता है। पूर्व में, WSARecv की def इस 'int WSAAPI WSARecv' की तरह शुरू होती है। 'WSAAPI' हल करता है (कई #defines के माध्यम से) __stdcall तक। –

+0

@MarcSherman मुझे कॉलिंग सम्मेलन के बारे में पता है, लेकिन कॉलिंग सम्मेलन का रजिस्टर संरक्षण हिस्सा है? – baruch

1

यह इंटेल एप्लिकेशन बाइनरी इंटरफ़ेस है, नियमों का एक सेट है जो रजिस्ट्रारों को सहेजे बिना उपयोग के लिए उपलब्ध है, स्टैक पर तर्क कैसे धकेलते हैं, कॉलर या कैली साफ़ करता है ढेर फ्रेम और इतने पर।

यदि आप जानते हैं कि नियमों का पालन किया जा रहा है, तो यह ठीक है। मैं बस मामले में सबकुछ बचाता हूं (उन चीज़ों के अलावा जो मैं पाठ्यक्रम की जानकारी लौटने के लिए उपयोग कर रहा हूं)।

लेकिन यह सभी कंपाइलरों के लिए जरूरी नहीं है और आप तब तक सोचने के लिए मूर्ख नहीं होंगे जब तक कि संकलक विशेष रूप से यह कहता न हो।