2010-08-28 10 views
5

उदाहरण:जीसीसी इनलाइन असेंबली भाषा में आर() और डबल प्रतिशत %% क्या है?

int main(void) 
{ 
    int x = 10, y; 

    asm ("movl %1, %%eax;" 
     "movl %%eax, %0;" 
     :"=r"(y) /* y is output operand */ 
     :"r"(x)  /* x is input operand */ 
     :"%eax"); /* %eax is clobbered register */ 
} 
  • r(y) क्या है?
  • क्यों %%eax से पहले उपयोग किया जाता है? आम तौर पर एकल % सही उपयोग किया जाता है?
+0

इसके अलावा मुझे क्या नहीं मिला = आर (वाई) और आर (एक्स)? एक क्लॉबर्ड रजिस्टर भी क्या है? – brett

+0

डबल प्रतिशत सबक्वेस्टियन: http://stackoverflow.com/questions/14745631/what-does-a-double-percent-sign-do-in-gcc-inline-assembly –

+0

मूल बनाम विस्तारित एएसएम से सावधान रहें: http: // stackoverflow.com/a/31711138/895245 –

उत्तर

4

ठीक है, यह जीसीसी इनलाइन असेंबलर है जो बहुत शक्तिशाली लेकिन समझने में मुश्किल है।

सबसे पहले,% char एक विशेष char है। यह आपको रजिस्टर और नंबर प्लेसहोल्डर्स को परिभाषित करने देता है (बाद में इस पर mor)। दुर्भाग्यवश% को एक रजिस्टर नाम (जैसे% EAX) के हिस्से के रूप में भी उपयोग किया जाता है, इसलिए जीसीसी इनलाइन असेंबलर में आपको दो प्रतिशत वर्णों का उपयोग करना होगा यदि आप एक रजिस्टर नाम देना चाहते हैं।

% 0,% 1 और% 2 (ect ..) प्लेसहोल्डर इनपुट और आउटपुट ऑपरेंड हैं। इन्हें सूची में परिभाषित किया जाता है जिसके बाद असेंबलर स्ट्रिंग होती है। आपके उदाहरण में% 0 y के लिए प्लेसहोल्डर बन जाता है, और% 1 x के लिए प्लेसहोल्डर बन जाता है। कंपाइलर यह सुनिश्चित करेगा कि एएसएम-कोड निष्पादित होने से पहले इनपुट ऑपरेटरों के लिए वेरिएबल्स रजिस्टरों में होंगे, और यह सुनिश्चित करेगा कि आउटपुट ऑपरेंड आउटपुट ऑपरेंड सूची में निर्दिष्ट चर पर लिखा जाएगा।

अब आपको पता होना चाहिए कि आर (वाई) क्या है: यह एक इनपुट ऑपरेंड है जो परिवर्तनीय वाई के लिए एक रजिस्टर आरक्षित करता है और इसे प्लेसहोल्डर% 1 को असाइन करता है (क्योंकि यह इनलाइन असेंबलर के बाद सूचीबद्ध दूसरा ऑपरेंड है स्ट्रिंग)। कई अन्य प्लेसहोल्डर प्रकार हैं। मी आपको स्मृति स्थान निर्दिष्ट करने देता है, और यदि मुझे गलत नहीं लगता है तो मुझे संख्यात्मक स्थिरांक के लिए उपयोग किया जा सकता है। आप उन्हें सभी जीसीसी दस्तावेज में सूचीबद्ध पाएंगे।

तब क्लॉबर सूची है। यह सूची महत्वपूर्ण है! यह सभी रजिस्टरों, झंडे, स्मृति-स्थान ect सूचीबद्ध करता है जो आपके असेंबलर कोड (जैसे आपके उदाहरण में ईएक्स) में संशोधित हो जाते हैं। यदि आपको यह गलत लगता है तो ऑप्टिमाइज़र नहीं जानता है कि क्या संशोधित किया गया है और यह बहुत संभव है कि आप उस कोड के साथ समाप्त हो जाएं जो काम नहीं करता है।

आपका उदाहरण लगभग व्यर्थ तरीके से है। यह सिर्फ मान एक्स को एक रजिस्टर में लोड करता है और इस रजिस्टर को ईएक्स को असाइन करता है। बाद में ईएक्स दूसरे रजिस्टर में संग्रहीत हो जाता है जो बाद में आपके वाई चर बन जाएगा।तो यह सब एक सरल असाइनमेंट है:

वाई = एक्स;

एक आखिरी बात: यदि आपने पहले इंटेल-स्टाइल असेंबलर के साथ काम किया है: आपको पीछे के तर्कों को पढ़ना होगा। सभी निर्देशों के लिए स्रोत ऑपरेंड स्वयं निर्देश के बाद एक है, और लक्ष्य ऑपरेंड अल्पविराम के दाईं ओर एक है। इंटेल वाक्यविन्यास की तुलना में यह बिल्कुल दूसरी तरफ है।

0

मैं इन सबको जवाब नहीं दे सकता, लेकिन एक क्लॉबर्ड रजिस्टर वह है जो गणना में कहीं भी इसका उपयोग इस तरीके से किया जाएगा जो इसके वर्तमान मूल्य को नष्ट कर देगा। तो यदि कॉलर बाद में वर्तमान मूल्य का उपयोग करना चाहता है, तो इसे किसी भी तरह से सहेजने की आवश्यकता है।

asm इस तरह के निर्देश, जब आप असेंबली लिखते हैं तो आप यह पता लगाते हैं कि कौन से रजिस्टरों को इसके द्वारा गिरफ्तार किया जा रहा है; फिर आप संकलक को बताएं (जैसा कि आपके उदाहरण में दिखाया गया है), और संकलक ऐसा करता है कि यदि आवश्यक हो तो उस रजिस्टर के वर्तमान मूल्य को संरक्षित करने के लिए उसे क्या करना है। संकलक इस बारे में बहुत कुछ जानता है कि बाद में गणनाओं के लिए रजिस्टरों और अन्य जगहों में मूल्यों का उपयोग कैसे किया जाएगा, लेकिन यह आमतौर पर एम्बेडेड असेंबली का विश्लेषण नहीं कर सकता है। तो आप स्वयं विश्लेषण करते हैं और संकलक क्लॉबरिंग जानकारी का उपयोग अपने अनुकूलन विकल्पों में असेंबली को सुरक्षित रूप से शामिल करने के लिए करता है।

0

this tutorial आज़माएं। इसमें आपके द्वारा पूछे जाने वाले सभी सामान शामिल हैं: उदाहरण के लिए, section 6 आज़माएं - यह बाधाओं को काफी अच्छी तरह से बताता है, और "=" चिह्न क्या है। यहां तक ​​कि क्लॉबर्ड रजिस्टरों की अवधारणा भी शामिल है (धारा 5.3)।

+0

इस प्रश्न में कोड नमूना उस ट्यूटोरियल की धारा 5 से तीसरा उदाहरण प्रतीत होता है ... :-) –

+0

@Laurence यदि ओपी वास्तव में उस ट्यूटोरियल का उपयोग कर रहा है, तो यह प्रश्न केवल इंगित करता है कि उसने अभी तक पूरे ट्यूटोरियल को नहीं पढ़ा है, क्योंकि ट्यूटोरियल में हर बिंदु का उत्तर दिया जाता है। –

1

"आर" या "= आर" वाली रेखाएं ऑपरेंड बाधाएं हैं। "=" का मतलब आउटपुट ऑपरेंड है। मूलतः, यह:

:"=r"(y) 
:"r"(x) 

मतलब यह है कि% 0 (यानी: पहला संकार्य) y से मेल खाती है और उत्पादन के लिए है, और% 1 (दूसरा संकार्य) x से मेल खाती है।

एटी & टी सिंटैक्स असेंबली में आमतौर पर एक एकल% का उपयोग किया जाता है, लेकिन इनलाइन असेंबली के लिए एकल% ऑपरेंड संदर्भों के लिए उपयोग किया जाता है (उदाहरण:% 0,% 1) जबकि शाब्दिक रजिस्टर संदर्भों के लिए डबल% का उपयोग किया जाता है। अगर आप आउटपुट में शाब्दिक% चाहते हैं तो प्रिंटफ प्रारूप में डबल% का उपयोग करने के तरीके के बारे में सोचें।

एक क्लॉबर्ड रजिस्टर एक रजिस्टर है जिसका मूल्य असेंबली कोड द्वारा संशोधित किया जाएगा। जैसा कि आप कोड से देख सकते हैं, ईएक्स को लिखा गया है। आपको इस बारे में जीसीसी को बताने की जरूरत है ताकि यह जान सके कि संकलित कोड इस असेंबली को आमंत्रित करने के बारे में बाद में ईएक्स में कुछ भी नहीं रख सकता है।

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