2017-01-25 12 views
5

मैं System V Application Binary Interface पढ़ रहा हूं, और एक ऐसा हिस्सा है जिसे मैं समझ नहीं सकता।सरणी के लिए एक कॉलिंग सम्मेलन क्यों है?

पहले, दस्तावेज़ कहा गया है कि सी

(पेज 10) के अलावा अन्य भाषाओं के लिए एक ABI निर्दिष्ट करने के लिए

कोई प्रयास नहीं किया गया है।

बाद में, पेज 20 पर, सरणियों स्मृति सूचक आदि .: के रूप में वर्गीकृत किया जाता है

कुल (संरचनाओं और सरणियों) और संघ प्रकार के वर्गीकरण से काम करता है इस प्रकार है:
...

वर्गीकरण तब कॉलिंग सम्मेलनों को परिभाषित करने के लिए उपयोग किया जाता है - उन पर मूल्यों और सीमाओं को कैसे पारित किया जाता है और कार्यों से लौटाया जाता है। अगर मैं एल्गोरिदम सही ढंग से पढ़ रहा हूं, तो एक सरणी को इंटेगर, मेमरी, या एसएसई के रूप में वर्गीकृत किया जा सकता है।

लेकिन सी भाषा में, सरणी हमेशा पास हो जाती हैं और पॉइंटर्स के रूप में लौटती हैं। तो यह सरणी वर्गीकृत करने के लिए उपयोगी क्यों है और सरणी वर्ग किस स्थिति में मायने रखता है?

+1

पहले बोली, अपने आप में, समझने में आसान है, क्योंकि सी है [सामान्य भाषा] (https: // en यूनिक्स दुनिया के .wikipedia.org/विकी/लिंगुआ_फ्रान्का)। दूसरे उद्धरण के लिए, सी सी पॉइंटर्स के रूप में सरणी पास करता है (या रेटर को अपने पहले तत्व में एक पॉइंटर को सरणी क्षय होने देता है) क्योंकि यह सी शुरुआत से ही काम करता है और सी विनिर्देश कहता है कि यही होना चाहिए। –

+1

[संबंधित प्रश्न] (http://stackoverflow.com/questions/38800044/what-kind-of-c11-data-type-is-an-array-according-to-the-amd64-abi)। –

उत्तर

1

मुझे यह पता चला: यदि कोई सरणी संरचना या संघ का हिस्सा है, तो इसे एक रजिस्टर में पारित किया जा सकता है।

इस सी कोड

#include <stdint.h> 

struct somebytes { 
    uint8_t bytes[8]; 
}; 

uint8_t plus(struct somebytes p) { 
    return p.bytes[3]+p.bytes[5]; 
} 

इस विधानसभा के लिए अनुवाद:

mov %rdi,%rax 
shr $0x28,%rdi 
shr $0x18,%rax 
add %edi,%eax 
retq 
संबंधित मुद्दे