दिलचस्प पोस्ट
आईओएस शुरू पृष्ठभूमि थ्रेड मैं एक प्रश्न निष्पादन योजना कैसे प्राप्त करूं? एंड्रॉइड से शैल कमांड निष्पादित करें दिए गए HTML के साथ एक आइफ्रेम बनाना गतिशील रूप से Excel CSV – संख्या सेल प्रारूप Postgresql में MySQL के आदेश द्वारा फ़ील्ड () का अनुकरण करना यूनिक्स सॉर्ट कमांड एक बहुत बड़ी फ़ाइल कैसे तय कर सकता है? बाहरी कोष्ठक से मेल करने के लिए नियमित अभिव्यक्ति ग्रहण: जेवीएम समाप्त कोड से बाहर निकलें = 2 php त्रुटि शामिल नहीं पथ खोजना एसक्यूएल – एक तालिका से रिकॉर्ड खोजें जो दूसरे में मौजूद नहीं है नेविगेशन नियंत्रक का उपयोग किए बिना SWrevealViewController क्रोम एक्सटेंशन के ब्राउज़र एक्शन, पृष्ठभूमि स्क्रिप्ट, और कंटेंट स्क्रिप्ट के बीच संचार के संदर्भ और तरीके? PHP में वैकल्पिक पैरामीटर मान निर्दिष्ट करने का कोई तरीका? पॉपअप संदेश जैसे स्टैक ओवरफ्लो में कैसे दिखाना है

एआरएम से सी कॉलिंग कन्वेंशन, रजिस्टरों को बचाने के लिए

आखिरकार मैंने हाथ कोडांतरण वाला आखिरी कोडिंग किया था और मैं विवरणों पर थोड़ी सी जंगली हूँ। अगर मैं हाथ से सी फ़ंक्शन कॉल करता हूं, तो मुझे केवल आर 0 आर 3 और एलआर को बचाने की चिंता है, है ना? अगर सी फ़ंक्शन किसी भी अन्य रजिस्टरों का उपयोग करता है, तो क्या उन्हें स्टैक पर सहेजने और उन्हें पुनर्स्थापित करने के लिए जिम्मेदार है? दूसरे शब्दों में, संकलक सी फ़ंक्शन के लिए ऐसा करने के लिए कोड उत्पन्न करेगा। उदाहरण के लिए यदि मैं एक कोडांतरक फ़ंक्शन में R10 का उपयोग करता हूं, तो मुझे स्टैक, या मेमोरी पर इसके मान को पुश करने की ज़रूरत नहीं है, और मुझे सी कॉल के बाद पॉप / बहाल करना है?

यह आर्म-एबी-जीसीसी 4.3.0 के लिए है

मुझे एहसास हुआ कि मैं पूरी ईएबी को पढ़ सकता हूं, लेकिन फिर RTFM को शॉर्टकटिंग करना है, ऐसा क्या है, है ना? 🙂

वेब के समाधान से एकत्रित समाधान "एआरएम से सी कॉलिंग कन्वेंशन, रजिस्टरों को बचाने के लिए"

यह आपके लिए संकलित मंच के लिए एबीआई पर निर्भर करता है। लिनक्स पर, दो एआरएम एबीआई हैं; पुराना एक और नया एएपीएआईके, नया वाला (ईएबीआई) वास्तव में एआरएम के एएपीसीएस है। पूरी EABI परिभाषाएं वर्तमान में एआरएम के इन्फोसेंटर पर मौजूद हैं ।

एएपीसीएस से, §5.1.1 :

  • आर 0-आर 3 तर्क और खरोंच रजिस्टरों हैं; r0-r1 भी परिणाम रजिस्टर हैं
  • आर 4-आर 8 कैली -सेज रजिस्टरों हैं
  • आर 9 एक कैली-सेवर रजिस्टर हो सकता है या नहीं (एएपीसीएस के कुछ संस्करणों पर यह एक विशेष रजिस्टर है)
  • आर -10-आर 11 कैली -सेज रजिस्टरों हैं
  • r12-r15 विशेष रजिस्टरों हैं

एक बछेड़ा-बचाने के रजिस्टर को बछड़ा द्वारा बचाया जाना चाहिए (कॉलर-सेव रजिस्टर के विरोध में, जहां कॉलर रजिस्टर को बचाता है); इसलिए, यदि यह आप उपयोग कर रहे एबीआई है, तो आपको किसी अन्य फ़ंक्शन को कॉल करने से पहले आरएफ को बचाने की आवश्यकता नहीं है (अन्य फ़ंक्शन इसे सहेजने के लिए जिम्मेदार है)।

संपादित करें: आप किस कम्पाइलर का उपयोग कर रहे हैं, इसमें कोई फर्क नहीं पड़ता; विशेष रूप से जीसीसी कई अलग-अलग एबीआई के लिए कॉन्फ़िगर किया जा सकता है, और इसे कमांड लाइन पर भी बदला जा सकता है प्रजनन / एफ़िलॉग कोड को देखकर यह उपयोगी नहीं है, क्योंकि यह प्रत्येक फ़ंक्शन के लिए सिलवाया गया है और कंपाइलर एक रजिस्टर को सहेजने के अन्य तरीकों का उपयोग कर सकता है (उदाहरण के लिए, फ़ंक्शन के बीच में इसे सहेज कर)

नीन रजिस्टरों पर लापता जानकारी जोड़ने के लिए:

एएपीसीएस से , §5.1.1 कोर रजिस्टरों:

  • आर 0-आर 3 तर्क और खरोंच रजिस्टरों हैं; r0-r1 भी परिणाम रजिस्टर हैं
  • आर 4-आर 8 कैली -सेज रजिस्टरों हैं
  • आर 9 एक कैली-सेवर रजिस्टर हो सकता है या नहीं (एएपीसीएस के कुछ संस्करणों पर यह एक विशेष रजिस्टर है)
  • आर -10-आर 11 कैली -सेज रजिस्टरों हैं
  • r12-r15 विशेष रजिस्टरों हैं

एएपीसीएस से, §5.1.2.1 वीएफपी रजिस्टर उपयोग सम्मेलनों:

  • s16-s31 (d8-d15, q4-q7) को संरक्षित किया जाना चाहिए
  • s0-s15 (d0-d7, q0-q3) और d16-d31 (q8-q15) को संरक्षित करने की आवश्यकता नहीं है

मूल पोस्ट:
हाथ-टू-सी कॉल करने वाले सम्मेलन-नीयन-रजिस्टरों करने वाली बचाने

64-बिट एआरएम, ए 64 (एआरएम 64-बिट वास्तुकला के लिए प्रक्रिया कॉल मानक से) के लिए

तीस-एक, 64-बिट, सामान्य प्रयोजन (पूर्णांक) रजिस्टरों को A64 अनुदेश सेट में दिखाई देता है; इन्हें लेबल किया गया है r0-r30 64-बिट संदर्भ में ये रजिस्टरों को सामान्यतः नाम x0-x30 का उपयोग करने के लिए कहा जाता है; 32-बिट संदर्भ में रजिस्टरों को w0-w30 का उपयोग करके निर्दिष्ट किया जाता है । इसके अतिरिक्त, एक स्टैक-पॉइंटर रजिस्टर, एसपी , को प्रतिबंधित संख्या निर्देशों के साथ प्रयोग किया जा सकता है

  • सपा स्टैक पॉइंटर
  • आर 30 एलआर लिंक रजिस्टर
  • r29 एफपी फ़्रेम पॉइंटर
  • r19 … r28 Callee- बचाया रजिस्टरों
  • r18 प्लेटफ़ॉर्म रजिस्टर, यदि आवश्यक हो; अन्यथा एक अस्थायी रजिस्टर
  • r17 IP1 दूसरा अंतर-प्रक्रिया-कॉल अस्थायी रजिस्टर (कॉल veneers और PLT कोड द्वारा उपयोग किया जा सकता है); अन्य समय पर अस्थायी रजिस्टर के रूप में उपयोग किया जा सकता है
  • आर 16 आईपी 0 पहला इंट्रा-प्रोसेस-कॉल स्क्रैच रजिस्टर (कॉल विन्नेर और पीएलटी कोड द्वारा उपयोग किया जा सकता है); अन्य समय पर अस्थायी रजिस्टर के रूप में उपयोग किया जा सकता है
  • r9 … r15 अस्थायी रजिस्टरों
  • आर 8 अप्रत्यक्ष परिणाम स्थान रजिस्टर
  • आर 0 … आर 7 पैरामीटर / रिजल्ट रजिस्टर

पहले आठ रजिस्टरों, आर 0-आर 7 , का इस्तेमाल सब्रॉउटिन में तर्क मानों को पारित करने के लिए किया जाता है और किसी फ़ंक्शन से परिणाम मान वापस करने के लिए किया जाता है। उनका उपयोग नियमित रूप से (लेकिन, सामान्य तौर पर केवल उपकार्य कॉल के बीच) मध्यवर्ती मूल्यों को रखने के लिए किया जा सकता है।

एक रिसीवर आर 16 (आईपी 0) और आर 17 (आईपी 1) का उपयोग किसी लिंकर द्वारा एक नियमित और किसी भी सब-रूटिन के बीच स्क्रैच रजिस्टर के रूप में किया जा सकता है। उपनगरीय कॉल्स के बीच मध्यवर्ती मूल्यों को रखने के लिए उनका उपयोग नियमित रूप से किया जा सकता है।

रजिस्टर आरआईएल की भूमिका विशिष्ट मंच है। अगर एक मंच एबीआई को एक अंतर-प्रक्रियात्मक स्थिति (उदाहरण के लिए, धागा संदर्भ) को ले जाने के लिए एक समर्पित सामान्य प्रयोजन रजिस्टर की आवश्यकता है, तो उस प्रयोजन के लिए इस रजिस्टर का उपयोग करना चाहिए यदि प्लेटफॉर्म ABI की ऐसी कोई आवश्यकता नहीं है, तो उसे आरआईएल को अस्थायी रजिस्टर के रूप में उपयोग करना चाहिए। प्लेटफॉर्म ABI विनिर्देशन को इस रजिस्टर के उपयोग के लिए दस्तावेज करना चाहिए।

SIMD

एआरएम 64-बिट वास्तुकला के पास एक और बत्तीस रजिस्टरों, v0-v31 , जो कि सिम और फ़्लोटिंग-प्वाइंट आपरेशनों द्वारा इस्तेमाल किया जा सकता है। रजिस्टर का सटीक नाम परिवर्तन का आकार इंगित करेगा।

नोट: एआरआर 32 में, एआरआर 64 में, सीआईडी ​​और फ्लोटिंग-पॉइंट रजिस्टर के 128-बिट और 64-बिट दृश्य एक संकुचित दृश्य में कई रजिस्टरों को ओवरलैप नहीं करते हैं, इसलिए q1, d1 और s1 सभी एक ही प्रविष्टि को रजिस्टर में देखें बैंक।

पहले आठ रजिस्टरों, v0-v7 , का प्रयोग सबूतों में तर्क मान को पास करने के लिए किया जाता है और किसी फ़ंक्शन से परिणाम मान वापस करने के लिए उपयोग किया जाता है। उनका उपयोग नियमित रूप से (लेकिन, सामान्य तौर पर केवल उपकार्य कॉल के बीच) मध्यवर्ती मूल्यों को रखने के लिए किया जा सकता है।

रजिस्टरों v8-v15 को सबरॉउटिन कॉल्स में एक कैली द्वारा संरक्षित किया जाना चाहिए; शेष रजिस्टरों ( v0-v7, v16-v31 ) को संरक्षित करने की आवश्यकता नहीं है (या कॉलर द्वारा संरक्षित किया जाना चाहिए)। इसके अतिरिक्त, v8-v15 में संग्रहीत प्रत्येक मान के नीचे केवल 64-बिट्स संरक्षित किए जाने की आवश्यकता है; बड़े मूल्यों को संरक्षित करने के लिए कॉलर की जिम्मेदारी है

सीएसीएबी और पावेल के जवाब में एएपीसीएस से उद्धरण दिए गए हैं, लेकिन खुले मुद्दे बाकी हैं। क्या बछड़ा आर 9 बचाता है? आर 12 के बारे में क्या? आर 14 के बारे में क्या? इसके अलावा, जवाब बहुत सामान्य थे, और अनुरोध के अनुसार हाथ-एबी टूलचैन के लिए विशिष्ट नहीं था यह जानने के लिए एक व्यावहारिक दृष्टिकोण है कि कौन सी रजिस्टर कैली-सेव हुआ है और जो नहीं हैं।

निम्न सी कोड में एक इनलाइन असेंबली ब्लॉक होता है, जो रजिस्टरों को संशोधित करने का दावा करता है r-r12 और r14 संकलक एबीआई द्वारा आवश्यक रजिस्टरों को बचाने के लिए कोड तैयार करेगा।

 void foo() { asm volatile ( "nop" : : : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r14"); } 

कमांड लाइन arm-eabi-gcc-4.7 -O2 -S -o - foo.c और अपने प्लेटफॉर्म के लिए स्विचेस जोड़ें (उदाहरण के -mcpu=arm7tdmi )। यह आदेश एसटीडीओयूटी पर उत्पन्न विधानसभा कोड को प्रिंट करेगा। यह ऐसा कुछ दिखाई दे सकता है:

 foo: stmfd sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} nop ldmfd sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} bx lr 

नोट, कि संकलक जनरेटेड कोड आर 4-आर 11 को बचाता है और पुनर्स्थापित करता है कंपाइलर आर-आर 3, आर 12 को नहीं बचाता है। यह पुनर्स्थापना R14 (उर्फ एलआर) विशुद्ध रूप से दुर्घटनाग्रस्त है क्योंकि मुझे अनुभव से पता है कि निकास कोड आर 0 में सहेजा गया एलआर लोड भी कर सकता है और फिर "बीएक्स एलआर" के बजाय एक "बीएक्स आर 0" करता है। या तो -mcpu=arm7tdmi -mno-thumb-interwork को जोड़कर या -mcpu=cortex-m4 -mthumb का उपयोग करके हम थोड़ा अलग विधानसभा कोड प्राप्त करते हैं जो इस तरह दिखता है:

 foo: stmfd sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} nop ldmfd sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} 

फिर, आर 4-आर 11 को बचाया और पुनर्स्थापित किया जाता है। लेकिन आर 14 (उर्फ एलआर) बहाल नहीं है।

संक्षेप में:

  • r0-r3 नहीं callee- बचाया
  • आर -4-आर 11 कैली-बचाए गए हैं
  • आर 12 (उपनाम आईपी) कैली-सेव नहीं है
  • आर 13 (उर्फ एसपी) कैली-सेव किया गया है
  • आर 14 (उर्फ एलआर) कैली-बचा नहीं है
  • r15 (alias pc) प्रोग्राम काउंटर है और फ़ंक्शन कॉल से पहले lr के मान पर सेट है

यह कम से कम आर्म-एबी-जीसीसी के डिफ़ॉल्ट के लिए है। कमांड लाइन स्विच (विशेष रूप से -एमबी स्विच) हैं जो परिणाम को प्रभावित कर सकते हैं।

समारोह कॉल के लिए कॉर्टेक्स एम 3 वास्तुकला में कम से कम अंतर होता है और बीच में भी अंतर होता है।

यदि कोई इंटरप्ट उत्पन्न होता है तो यह स्वत: पुश R0-R3, R12, एलआर, पीसी को स्टैक पर और आईआरक्यू स्वत: POP पर वापस लौटाएगा। यदि आप IRQ routine में अन्य रजिस्टरों का उपयोग करते हैं तो आपको मैन्युअल रूप से स्टैक पर उन्हें पुश करने / पॉप करना होगा

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