2012-02-04 13 views
8

क्या है मैं विधानसभा भाषा सीख रहा हूं। तर्क पुश आदेश वास्तव में क्या है? मैं समझता हूं कि स्टैक पर तर्क कैसे धकेलते हैं लेकिन बाएं और दाएं हिस्से का क्या अर्थ है? क्या बाएं या दाएं? या यह आदेश केवल वांछित रूप से लिखे गए तरीके से करने के लिए है, i.e .:तर्क पुश ऑर्डर

mov ebp, esp; esp को ebp में दाएं से बाएं स्थानांतरित किया गया है।

क्या यह सही है या कोई मुझे प्रबुद्ध कर सकता है?

बहुत धन्यवाद!

उत्तर

11

प्रोसेसर को 'फ़ंक्शन तर्क' नहीं पता है। इसलिए जब आप f(a,b,c) लिखना चाहते हैं, तो आपको वाकई 'कहीं और तर्क' को धक्का देना होगा।

यह सम्मेलन है। मुझे पता है कि अधिकांश x86 मशीनों पर, फ़ंक्शन तर्क दाएं से बाएं से स्टैक पर धकेलते हैं, यानी पहले सी, फिर बी, फिर ए।

push c 
push b 
push a 
call f 

अब कहा जाता समारोह ग के लिए ख के लिए एक के लिए ebx -1, ebx - 2 और ebx - 3 उपयोग कर सकते हैं।

आप एक सम्मेलन भी स्थापित कर सकते हैं जो कहता है: पहले दो तर्क रजिस्ट्रार ebx और ecx में हैं, बाकी स्टैक पर हैं। जब तक कॉलर और कैली सहमत हैं, तो आप ठीक हैं।

7

xtofl के स्पष्टीकरण के अतिरिक्त आप x86 calling conventions की इस तालिका को देखना चाहेंगे। तर्क आदेश के संबंध में आप क्या ध्यान देंगे कि तर्कों के लगभग सभी पास्कल के अपवाद के साथ दाएं से बाएं (दाएं सबसे पहले तर्क को धक्का दिया जाता है) पर धक्का दिया जाता है।

एक और परिदृश्य xtofl कवर नहीं करता है पंजीकरण तर्क हैं - कुछ एबीआई को यह आवश्यक है कि कुछ तर्क में हैं, जो स्टैक पर के विपरीत हैं। एक x86_64 प्रणाली पर, उदाहरण के लिए, समारोह:

int add3(int a, int b, int c) 

डाल देंगे तर्क:

mov  rdi, [source-of-a] 
mov  rsi, [source-of-b] 
mov  rdx, [source-of-c] 
call add3 

तो रजिस्टरों:

a -> rdi 
b -> rsi 
c -> rdx 

विशेष रूप से, यह (इंटेल सिंटेक्स) कैसा लगेगा रजिस्टर सूची से बाएं से दाएं से भरे हुए हैं और फिर स्टैक का उपयोग दाएं से बाएं

xtofl कहते हैं, यह कोई बात नहीं तुम क्या प्रदान की है फोन करने वाले और कॉल प्राप्त करने वाला सहमत हूँ - स्पष्ट रूप से, हालांकि, अगर फोन करने वाले और कॉल प्राप्त करने वाला असहमत असंगति समस्याओं का कारण है कि और यह वास्तव में एक चिंता का विषय नहीं है केवल असेंबलर के लिए, लेकिन उच्च स्तर की भाषाओं के लिए भी - सौभाग्य से, कंपाइलर्स काफी हद तक बाएं काम करते हैं। आगे पढ़ने के लिए, आपको स्टैक रोचक का कैली/कॉलर क्लीनअप मिल सकता है - और ध्यान दें कि इसे x86_64 के लिए एक विधि के लिए कैसे मानकीकृत किया गया था।

आप नहीं कहते कि आप x86 का उपयोग कर रहे हैं - आपके आर्किटेक्चर में निश्चित रूप से मानक कॉलिंग सम्मेलन होगा क्योंकि इसके बिना काम करना मुश्किल है।

+0

आप दोनों के लिए बहुत बहुत धन्यवाद। यह बहुत उपयोगी था और अब मैं इसे बेहतर समझता हूं! धन्यवाद एक मिल !! – Axolotl

संबंधित मुद्दे