ठीक है, यह जीसीसी इनलाइन असेंबलर है जो बहुत शक्तिशाली लेकिन समझने में मुश्किल है।
सबसे पहले,% char एक विशेष char है। यह आपको रजिस्टर और नंबर प्लेसहोल्डर्स को परिभाषित करने देता है (बाद में इस पर mor)। दुर्भाग्यवश% को एक रजिस्टर नाम (जैसे% EAX) के हिस्से के रूप में भी उपयोग किया जाता है, इसलिए जीसीसी इनलाइन असेंबलर में आपको दो प्रतिशत वर्णों का उपयोग करना होगा यदि आप एक रजिस्टर नाम देना चाहते हैं।
% 0,% 1 और% 2 (ect ..) प्लेसहोल्डर इनपुट और आउटपुट ऑपरेंड हैं। इन्हें सूची में परिभाषित किया जाता है जिसके बाद असेंबलर स्ट्रिंग होती है। आपके उदाहरण में% 0 y के लिए प्लेसहोल्डर बन जाता है, और% 1 x के लिए प्लेसहोल्डर बन जाता है। कंपाइलर यह सुनिश्चित करेगा कि एएसएम-कोड निष्पादित होने से पहले इनपुट ऑपरेटरों के लिए वेरिएबल्स रजिस्टरों में होंगे, और यह सुनिश्चित करेगा कि आउटपुट ऑपरेंड आउटपुट ऑपरेंड सूची में निर्दिष्ट चर पर लिखा जाएगा।
अब आपको पता होना चाहिए कि आर (वाई) क्या है: यह एक इनपुट ऑपरेंड है जो परिवर्तनीय वाई के लिए एक रजिस्टर आरक्षित करता है और इसे प्लेसहोल्डर% 1 को असाइन करता है (क्योंकि यह इनलाइन असेंबलर के बाद सूचीबद्ध दूसरा ऑपरेंड है स्ट्रिंग)। कई अन्य प्लेसहोल्डर प्रकार हैं। मी आपको स्मृति स्थान निर्दिष्ट करने देता है, और यदि मुझे गलत नहीं लगता है तो मुझे संख्यात्मक स्थिरांक के लिए उपयोग किया जा सकता है। आप उन्हें सभी जीसीसी दस्तावेज में सूचीबद्ध पाएंगे।
तब क्लॉबर सूची है। यह सूची महत्वपूर्ण है! यह सभी रजिस्टरों, झंडे, स्मृति-स्थान ect सूचीबद्ध करता है जो आपके असेंबलर कोड (जैसे आपके उदाहरण में ईएक्स) में संशोधित हो जाते हैं। यदि आपको यह गलत लगता है तो ऑप्टिमाइज़र नहीं जानता है कि क्या संशोधित किया गया है और यह बहुत संभव है कि आप उस कोड के साथ समाप्त हो जाएं जो काम नहीं करता है।
आपका उदाहरण लगभग व्यर्थ तरीके से है। यह सिर्फ मान एक्स को एक रजिस्टर में लोड करता है और इस रजिस्टर को ईएक्स को असाइन करता है। बाद में ईएक्स दूसरे रजिस्टर में संग्रहीत हो जाता है जो बाद में आपके वाई चर बन जाएगा।तो यह सब एक सरल असाइनमेंट है:
वाई = एक्स;
एक आखिरी बात: यदि आपने पहले इंटेल-स्टाइल असेंबलर के साथ काम किया है: आपको पीछे के तर्कों को पढ़ना होगा। सभी निर्देशों के लिए स्रोत ऑपरेंड स्वयं निर्देश के बाद एक है, और लक्ष्य ऑपरेंड अल्पविराम के दाईं ओर एक है। इंटेल वाक्यविन्यास की तुलना में यह बिल्कुल दूसरी तरफ है।
स्रोत
2010-08-28 02:32:21
इसके अलावा मुझे क्या नहीं मिला = आर (वाई) और आर (एक्स)? एक क्लॉबर्ड रजिस्टर भी क्या है? – brett
डबल प्रतिशत सबक्वेस्टियन: http://stackoverflow.com/questions/14745631/what-does-a-double-percent-sign-do-in-gcc-inline-assembly –
मूल बनाम विस्तारित एएसएम से सावधान रहें: http: // stackoverflow.com/a/31711138/895245 –