2012-09-19 25 views
7

में पैरामीटर पैरामीटर और वापसी मानों को पास करना मैं एआरएम असेंबली के साथ काम कर रहा हूं, जहां मुझे एक सबराउटिन लिखनी है जिसके लिए मैं एआरएम कॉलिंग कन्वेंशन का पालन कर रहा हूं (इसे कहीं अलग उच्च स्तर के कार्यान्वयन के साथ एकीकृत किया जाना होगा अन्यथा) पैरामीटर गुजरने और मूल्यों को वापस करने के लिए। असेंबली के साथ काम करते समय मैं सामान्य रूप से कुछ निश्चित नहीं हूं।असेंबली

तो अगर मैं अच्छी तरह समझता हूं तो सम्मेलन से रजिस्ट्रार आर 0 - आर 4 से शुरू करने के लिए तर्क पारित किए जाते हैं और फिर अन्य तर्कों के लिए उपयोग किए जाते हैं। वापसी मूल्य आर 0 को पास कर दिए जाते हैं।

अब यहां मैं उलझन में हूं। अगर मुझे आर 0 के संदर्भ को सहेजना है और उसके बाद इसे पॉप करना है तो परिणाम वापस करने का कोई तरीका नहीं है, यह पहला तर्क दूषित करके एकमात्र तरीका किया जा सकता है। क्या कोई कामकाज है? अग्रिम लोगों में धन्यवाद!

उत्तर

6

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

आम तौर पर ARM calling convention requires that the subroutine preserves r4 through r11, r3 के माध्यम से r0 नहीं। तो वैसे भी कोई विरोधाभास नहीं है।

+0

तो मुझे लगता है कि यह कॉल करने से पहले आर 0 के संदर्भ को सहेजने के लिए कॉलर की ज़िम्मेदारी है। – as3rdaccount

+0

आपके द्वारा पोस्ट किए गए लिंक से: * "r0 से r3: एक सबराउटिन को पास किए गए तर्क मानों को पकड़ने के लिए उपयोग किया जाता है, और एक subroutine" * से लौटाए गए परिणाम भी पकड़ते हैं। – m0skit0

6

क्यों न केवल इसे स्वयंमाएं और देखें कि संकलक क्या करता है?

unsigned int fun (unsigned int a, unsigned int b) 
{ 
    return(a+b); 
} 

संकलन वस्तु और एकत्रित न

arm-none-eabi-gcc -O2 -c fun.c -o fun.o 
arm-none-eabi-objdump -D fun.o 

और परिणाम

00000000 <fun>: 
    0: e0810000 add r0, r1, r0 
    4: e12fff1e bx lr 

दो आदानों ए और बी r0 और r1 का उपयोग करने में पारित कर रहे हैं है। r0-r4 को संरक्षित नहीं किया जाना चाहिए, विशेष रूप से आर 0 क्योंकि यह वापसी मूल्य संरक्षित नहीं किया जा सकता है। इसलिए सी कोड के लिए दो ऑपरेंड एक साथ जोड़े जाने की आवश्यकता होती है, और कॉलिंग सम्मेलन के रूप में परिणाम आर 0 में वापस आ जाता है। आर 0 = आर 0 + आर 1।

कंपाइलर को सम्मेलन के अनुरूप होना चाहिए अन्यथा वह कोड जो काम नहीं करता है, ताकि आप आसानी से कोड को संकलित कर सकें और एक विशेष संकलक और लक्ष्य के लिए कॉलिंग सम्मेलन के बारे में काफी कुछ पता लगा सकें।