यह एक मामूली सवाल नहीं है।
नोट: मुझे शुद्ध एएसएम का उपयोग करने के लिए राय या सलाह की आवश्यकता नहीं है। मुझे वास्तव में ऐसा करने की ज़रूरत है जो मैं इस बारे में बात कर रहा हूं: इस साइन/शून्य के बिना इनलाइन एएसएम प्राप्त करने के लिए एक छोटा int परिणाम देने पर ऑप्टकोड का विस्तार करें।
मैं ऐसी लाइब्रेरी से निपट रहा हूं जो कई कार्यों के लिए 16-बिट शॉर्ट्स का दुरुपयोग करता है और मैं इसे अनुकूलित कर रहा हूं। मुझे इनलाइन एएसएम के साथ कुछ अनुकूलित फ़ंक्शन जोड़ने की आवश्यकता है। समस्या यह है कि कई जगहों पर फ़ंक्शन का परिणाम एक छोटा int को सौंपा गया है। यही है, कंपाइलर uxth या sxth arm opcode उत्पन्न करता है।
मेरा लक्ष्य उस समस्या से बचने और यह सुनिश्चित करने के लिए है कि यह बेकार ओपोड उत्पन्न नहीं हुआ है। सबसे पहले, मुझे छोटा int वापस करने के लिए अपने अनुकूलित फ़ंक्शन को परिभाषित करने की आवश्यकता है। इस तरह यदि इसे किसी इंट या कम int को सौंपा गया है तो परिणाम बदलने के लिए कोई अतिरिक्त ऑपोड नहीं है।
समस्या यह है कि मुझे कोई संकेत नहीं है कि उस int-> लघु रूपांतरण को कैसे छोड़ें जो संकलक मेरे स्वयं के फ़ंक्शन के अंदर उत्पन्न करता है।
गूंगा कास्ट जैसे: *(short*)(void*)&value
काम नहीं करता है। कंपाइलर या तो स्टैक बनाने की समस्या के साथ गड़बड़ करना शुरू कर देता है, या यह परिणाम को साइन-विस्तार करने के लिए अभी भी उसी Sxth का उपयोग करता है।
मैं एकाधिक कंपाइलर्स के लिए संकलित करता हूं, और मैं इसे बांह के armcc कंपाइलर के लिए हल करने में सक्षम था, लेकिन मैं इसे जीसीसी (मैं 4.4.3 या 4.6.3 के साथ संकलित) के साथ नहीं कर सकता। Armcc के साथ मैं इनलाइन एएसएम कथन के अंदर छोटे प्रकार का उपयोग करें। जीसीसी में भी अगर मैं किसी कारण से शॉर्ट कंपाइलर का उपयोग करता हूं तो भी मानना है कि साइन एक्सटेंशन की आवश्यकता है।
सी/सी ++ int को छोटा और इनलाइन एएसएम (एआरएम विशिष्ट) में परिवर्तित करें
यहां एक साधारण कोड स्निपेट है कि मैं जीसीसी के साथ काम नहीं कर सकता, यह काम करने के तरीके के बारे में कोई सलाह है?
नमूना फ़ाइल test.c फ़ाइल:
static __inline short CLZ(int n)
{
short ret;
#ifdef __GNUC__
__asm__("clz %0, %1" : "=r"(ret) : "r"(n));
#else
__asm { clz ret, n; }
#endif
return ret;
}
//test function
short test_clz(int n)
{
return CLZ(n);
}
यहाँ की उम्मीद है नतीजा यह है कि मैं armcc -c -O3 साथ मिलती है:
test_clz:
CLZ r0,r0
BX lr
यहाँ अस्वीकार्य नतीजा यह है कि जीसीसी -c -O3 मुझे देता है:
test_clz:
clz r0, r0
sxth r0, r0
bx lr
ध्यान दें कि अगर short ret;
के बजाय आंतरिक चर int ret;
के साथ सीएलजेड को फिर से लिखना है तो armcc जीसीसी के समान परिणाम उत्पन्न करता है।
त्वरित लाइन जीसीसी या armcc साथ एएसएम उत्पादन प्राप्त करने के लिए:
gcc -O3 -c test.c -o test.o && objdump -d test.o > test.s
armcc -O3 --arm --asm -c test.c
आप इनलाइन असेंबली को क्यों नहीं छोड़ते हैं और असेंबली में लिखे गए पूरे फ़ंक्शन के रूप में बस अपना अनुकूलित बिट लिखते हैं? आपकी समस्या आपके सी फ़ंक्शन और इनलाइन एएसएम के मिश्रण से आती है। लेकिन एक सी फ़ंक्शन क्यों लिखें जिसमें केवल एएसएम का गुच्छा शामिल है? – TJD
कोई विकल्प नहीं। मैं उन कार्यों को फिर से लिखता हूं जिन्हें वास्तव में पूरी तरह से एएसएम में लिखा जाना आवश्यक है। इसे सही तरीके से करने के लिए मुझे शायद पूरे कोड पर जाने और शॉर्ट्स के बजाय इनट्स का उपयोग करने की आवश्यकता होगी, लेकिन अकेले वह कार्य मुझे कोड की मात्रा के साथ दिन ले सकता है जिसे मुझे अपडेट करने की आवश्यकता होगी + प्लस परीक्षण। – Pavel