2010-11-24 11 views
9

मैं उत्कृष्ट पुस्तक प्रोग्रामिंग ग्राउंड अप का पालन कर रहा हूं, जो असेंबली सीखना चाहता है। यद्यपि इस बिंदु पर पुस्तक में नहीं, मैं 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 बिट पर स्टैक पर तर्क क्यों पास करता है? यह बहुत भ्रमित है! और मुझे इस पर कहीं भी कोई उल्लेख नहीं मिल रहा है। क्या कोई ऐसा व्यक्ति है जो मुझे इस स्थिति पर उजागर कर सकता है?

+1

x64 कॉलिंग सम्मेलन x86 वाले के लिए अलग हैं। ज्यादातर मामलों में, अतिरिक्त रजिस्टरों के कारण, पहले चार तर्क रजिस्टरों में पास किए जाते हैं। – wj32

उत्तर

27

64-बिट सी बुला सम्मेलन है: "System V Application Binary Interface: AMD64 Architecture Processor Supplement" http://www.x86-64.org/documentation/abi.pdf

3,2 समारोह कॉलिंग अनुक्रम

:% RDI,% RSI,% RDX,% RCX,% R8 और% r9

यहाँ पूर्ण विवरण देखें

जब मैंने एक ही विषय सीखा, तो मैंने छोटे कार्यों को आवश्यक कार्यों के साथ बनाया, उन्हें 64 बिट कंपाइलर में संकलित किया और सी कंपाइलर द्वारा उत्पादित असेंबली कोड को पढ़ा। सी/सी ++ कंपाइलर का इस्तेमाल विधानसभा संदर्भ की तरह किया जा सकता है।

+0

मैंने उस सटीक दस्तावेज़ के माध्यम से स्किम किया, लेकिन मैंने इसे और अधिक बारीकी से पढ़ा, और यह सब वहाँ है, और यह अब पूरी तरह से समझ में आता है। धन्यवाद! – Cbsch

+0

आपके संपादन के लिए: हाँ, इस तरह मैं इसे करने की कोशिश करता हूं। काम करने के लिए असेंबली फ़ंक्शन को संशोधित करना कोई समस्या नहीं थी, और यह देखते हुए कि कंपाइलर क्या करता है, कोई समस्या नहीं है, समस्या यह थी कि मुझे इस व्यवहार के नियमों को समझ में नहीं आया। लेकिन आपके द्वारा लिंक किया गया दस्तावेज़ उस के लिए सही उत्तर था। – Cbsch

+10

एक नोट के रूप में, विंडोज एक अलग एबीआई - http://msdn.microsoft.com/en-us/library/ms235286.aspx का उपयोग करता है केवल तर्क के लिए आरसीएक्स, आरडीएक्स, आर 8, आर 9 के साथ। – Brian

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