मैं उत्कृष्ट पुस्तक प्रोग्रामिंग ग्राउंड अप का पालन कर रहा हूं, जो असेंबली सीखना चाहता है। यद्यपि इस बिंदु पर पुस्तक में नहीं, मैं 32 बिट मशीन पर सी से अपने असेंबली फ़ंक्शन को कॉल करना चाहता था, यह पुस्तक से काम करते समय काम करता है।सी से असेंबली कॉल सम्मेलन 32 बिट बनाम 64 बिट
मैं यहां क्या करता हूं %ebx
में पहला तर्क और %ecx
में दूसरा तर्क संग्रहीत कर रहा है।
.type power, @function
.globl power
power:
pushq %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %ebx
movl 12(%ebp), %ecx
मैं एक वस्तु फ़ाइल में इस (और समारोह के बाकी) संकलन, एक main.c, जहां मैं समारोह प्रोटोटाइप बना सकते हैं और यह कहते हैं, कुछ इस तरह:
int power(int b, int x);
int a = power(2, 1);
हालांकि , जब मैं इसे 64 बिट मशीन पर संकलित करता हूं, तो मुझे कुछ अप्रत्याशित परिणाम मिलते हैं। मैंने स्पष्ट रूप से संशोधित किया, इस तथ्य की तरह कि %esp
और %epb
को %rsp
और के साथ प्रतिस्थापित करने की आवश्यकता है, लेकिन जीडीबी के साथ खुदाई से पता चलता है कि तर्क स्टैक पर कहीं भी नहीं पाए जाते हैं!
जीसीसी में -S
विकल्प का उपयोग करके क्या होता है, यह देखकर मैं देख सकता हूं कि स्टैक पर चर को धक्का देने के बजाय, जीसीसी रजिस्टरों में तर्क संग्रहीत करता है।
movl $1, 4(%esp)
movl $2, (%esp)
call power
अब यहाँ क्या हो रहा है:
movl $1, %esi
movl $2, %edi
call power
32 बिट मशीन पर, यह मैं क्या उम्मीद और स्टैक पर बहस धक्का करता है? जीसीसी रजिस्टरों में 64 बिट पर और 32 बिट पर स्टैक पर तर्क क्यों पास करता है? यह बहुत भ्रमित है! और मुझे इस पर कहीं भी कोई उल्लेख नहीं मिल रहा है। क्या कोई ऐसा व्यक्ति है जो मुझे इस स्थिति पर उजागर कर सकता है?
x64 कॉलिंग सम्मेलन x86 वाले के लिए अलग हैं। ज्यादातर मामलों में, अतिरिक्त रजिस्टरों के कारण, पहले चार तर्क रजिस्टरों में पास किए जाते हैं। – wj32