2008-10-26 11 views
27

यह कैसे किया जाता है? मुझे क्या कदम उठाने की ज़रूरत है और विचार करने के लिए क्या नुकसान और गठजोड़ हैं?मैं आईफोन पर इनलाइन असेंबली कैसे करूं?

+0

अच्छा सवाल है, मैं बहुत देखने के लिए इच्छुक हूँ प्रतिक्रियाओं। – mdec

उत्तर

18

मैं काम करने के लिए, कुछ अंदर मदद के लिए धन्यवाद Apple Devforums पर पर इस मिल गया है, अगर आप एक समर्पित IPhone डेवलपर हैं, साइन अप करना चाहिए।

पहली बात का पहला, यह __asm ​​__(), नहीं सादे एएसएम()

दूसरे, डिफ़ॉल्ट रूप से, XCode एक संकलन लक्ष्य है कि एआरएम अंगूठे अनुदेश सेट के खिलाफ इनलाइन विधानसभा संकलित उत्पन्न करता है, तो USAT एक उचित शिक्षा के रूप में पहचाना गया था। इसे ठीक करने के लिए, लक्ष्य पर "जानकारी प्राप्त करें" करें। "जीसीसी 4.0 - कोड जनरेशन" अनुभाग में नीचे स्क्रॉल करें और "थंब के लिए संकलन" अनचेक करें। फिर इस निम्नलिखित स्निपेट स्वाभाविक रूप से करता है, तो आप "उपकरण" के लिए सक्रिय एसडीके सेट ठीक संकलन होगा

inline int asm_saturate_to_255 (int a) { 
    int y; 
    __asm__("usat %0, #8, %1\n\t" : "=r"(y) : "r"(a)); 
    return y; 
} 

, अब यह IPhone सिम्युलेटर के साथ काम नहीं करेगा। लेकिन TargetConditionals.h परिभाषित करता है कि आप #ifdef के खिलाफ कर सकते हैं। अर्थात् TARGET_OS_IPHONE और TARGET_IPHONE_SIMULATOR

+2

मुझे लगता है कि आप सादा asm() के बजाय __asm ​​__() का मतलब है। –

+0

यह आईफोन सिम्युलेटर के साथ क्यों काम नहीं करता है? क्या यह सिम्युलेटर पर कोई असेंबली काम नहीं करता है, या यह है कि आपको असेंबली निर्देशों का एक अलग सेट होना है क्योंकि यह i386 पर चल रहा है? – Roberto

+0

@ रॉबर्टो: आपको मिल गया। सिम्युलेटर x86 पर चल रहा है, इसलिए आप एआरएम असेंबली नहीं चला सकते हैं। यह सिर्फ संकलित नहीं होगा। –

11

मैं एआरएम कॉर्टेक्स-ए 8 असेंबली-कोड का थोड़ा सा लिखता हूं। आईफोन पर सीपीयू एक एआरएम 11 (afaik) है, इसलिए मूल निर्देश सेट वही है।

आप वास्तव में क्या देख रहे हैं? यदि आप चाहें तो मैं आपको कुछ उदाहरण दे सकता हूं।


संपादित करें:

मैं सिर्फ पता चला आप LLVM-जीसीसी संकलक का उपयोग करना होगा iPhone पर। जहां तक ​​मुझे पता है कि इसे जीसीसी से इनलाइन असेंबलर सिंटैक्स को समझना चाहिए। यदि ऐसा है तो सभी एआरएम इनलाइन असेंबलर ट्यूटोरियल भी आईफोन पर काम करेंगे।

यहां एक बहुत ही कम इनलाइन असेंबलर फ़ंक्शन (सी में) है। क्या आप कृपया मुझे बता सकते हैं कि यह आईफोन पर संकलित और काम करता है? अगर यह काम करता है तो मैं एआरएम इनलाइन असेंबलर में विशेष रूप से एआरएमवी 6 आर्किटेक्चर और डीएसपी एक्सटेंशन के लिए उपयोगी चीजें कैसे कर सकता हूं।

inline int saturate_to_255 (int a) 
{ 
    int y; 
    asm ("usat %0, #8, %1\n\t" : "=r"(y) : "r"(a)); 
    return y; 
} 

के बराबर होना चाहिए:

inline int saturate_to_255 (int a) 
{ 
    if (a < 0) a =0; 
    if (a > 255) a = 255; 
    return a; 
} 
+1

मैं इसे संकलित करने में सक्षम नहीं हूं। मैं ऐप्पल के एक्सकोड के माध्यम से कोशिश कर रहा हूं। संकलक वास्तव में डिफ़ॉल्ट रूप से जीसीसी 4 पर सेट होता है। यदि मैं इसका उपयोग करके संकलित करता हूं तो यह एक अमान्य निर्देश 'usat' की शिकायत करता है और यदि मैं इसे llvm-gcc का उपयोग करने के लिए सेट करता हूं तो यह एक अवैध आर्किटेक्चर, 'armv6' की शिकायत करता है। –

+0

gcc -O3 -march = armv6 परीक्षण आज़माएं।सी –

+0

वास्तव में llvm-gcc नहीं है जो एक संकलक है जो llvm वर्चुअल मशीन को लक्षित करता है? – artificialidiot

0

अंगूठे को उस एप्लिकेशन के लिए अनुशंसित किया जाता है जिसके लिए भारी फ्लोट ऑपरेशन की आवश्यकता नहीं होती है। थंब कोड कोड को छोटा बनाता है और परिणाम भी तेज कोड निष्पादन में होता है।

तो आप केवल अंगूठे बंद 3 डी गेम्स की तरह आवेदन के लिए बारी चाहिए ...

+3

वास्तव में, नियम के रूप में, अंगूठे निर्देश सेट का उपयोग करके एआरएम निर्देश सेट का उपयोग करने से काफी धीमी है। अंगूठे के नियम के रूप में (कोई इरादा नहीं है), आप कोड आकार में 1/3 प्राप्त करते हैं और गति में 1/3 ढीले होते हैं। उदाहरण देखें। http://www.arm.com/pdfs/Thumb-2CoreTechnologyWhitepaper-Final4.pdf –

1

रजिस्टरों भी इनलाइन एएसएम में स्पष्ट रूप से इस्तेमाल किया जा सकता

void foo(void) { 
#if TARGET_CPU_ARM64 
    __asm ("sub  sp, sp, #0x60"); 
    __asm ("str  x29, [sp, #0x50]"); 
#endif 
} 
संबंधित मुद्दे