मुझे एक ऐसा कार्य सौंपा गया है जो सैद्धांतिक रूप से बहुत कठिन नहीं है। असेंबलर कोड (एएसएम) का उपयोग करके एक सी चर बदलना चाहिए। मैंने यह किया है और यह काम करता है, लेकिन असाइनमेंट का दूसरा भाग प्लेसहोल्डर्स (%) का उपयोग किए बिना एक ही काम करना है।प्लेसहोल्डर्स का उपयोग किये बिना सी में असेंबलर का उपयोग
मैं यहां एक नुकसान में हूं और कुछ शोध के बाद मुझे अभी भी समाधान नहीं मिला है। परिवर्तक प्राप्त करने के लिए प्लेसहोल्डर्स का उपयोग किये बिना मैं असेंबलर कोड में सी चर का उपयोग कैसे कर सकता हूं?
volatile uint8_t number = 1;
volatile uint8_t *number_pointer = &number;
asm volatile(
"ld r20, %a0" "\n\t"
"lsl r20" "\n\t"
"st %a0, r20" "\n\t"
"breq resetten" "\n\t"
"ret" "\n\t"
"resetten:" "\n\t"
"ldi r20, 1" "\n\t"
"st %a0, r20"
: "+e" (number_pointer)
);
संक्षेप में:: मैं कैसे उपयोग कर सकते हैं और परिवर्तन "number_pointer" एक% का उपयोग किए बिना
यहाँ प्लेसहोल्डर के साथ कोड है? (कोड 128 गुना होने तक "संख्या" है, फिर यह 1 से शुरू होता है।)
यदि परिवर्तनीय को बदलने के लिए स्थानीय (स्टैक पर) है तो आप कंपाइलर-निर्भर धारणाएं बना सकते हैं कि वेरिएबल स्टैण्ड पॉइंटर से संबंधित स्मृति में कहां स्थित है। –
आपको रजिस्टरों में चर प्रस्तुत करने के लिए दूसरा ':' जोड़ना होगा (जैसे 'asm ("blabla":: "a" (number_pointer));'), लेकिन eax में number_pointer होगा ... हालांकि, उपयोग करना एटी एंड टी वाक्यविन्यास आप अभी भी इसका उपयोग करने के लिए '%% eax' का उपयोग करेंगे। यदि आवश्यकता '%' का उपयोग नहीं कर रही है (जैसा कि आप अंत में इंगित करते हैं), तो यह काम नहीं करता है ... यदि आवश्यकता __placehold__ का उपयोग नहीं कर रही है, तो ऐसा होगा (आप एक रजिस्टर का उपयोग करेंगे)। – Jcl
stat_pointer को स्थैतिक या वैश्विक के रूप में घोषित करने के बारे में कैसे? फिर आप प्रतीक नाम के माध्यम से सीधे एएसएम से इसका उपयोग कर सकते हैं। मैं इसे उत्पादन कोड के लिए अनुशंसा नहीं करता, लेकिन पहेली हल करने के लिए इसे काम करना चाहिए। –