2013-09-30 4 views
8

मैं अध्ययन कर रहा हूं कि कैसे सी ++ असेंबली भाषा के माध्यम से सही सदस्य कार्यों का आह्वान करता है। साधारण प्रोग्राम है कि मैं के साथ आते हैं निम्नलिखित है:रजिस्टर से पहले स्टार डालने का क्या अर्थ है?

main: 
.LFB2: 
    .cfi_startproc 
    .cfi_personality 0x3,__gxx_personality_v0 
    pushq %rbp 
    .cfi_def_cfa_offset 16 
    movq %rsp, %rbp 
    .cfi_offset 6, -16 
    .cfi_def_cfa_register 6 
    pushq %rbx 
    subq $24, %rsp 
    movl $8, %edi 
    .cfi_offset 3, -24 
    call _Znwm   <<<================ 1 
    movq %rax, %rbx 
    movq %rbx, %rax 
    movq %rax, %rdi 
    call _ZN1BC1Ev 
.L11: 
    movq %rbx, %rax 
    movq %rax, -24(%rbp) 
    movq -24(%rbp), %rax 
    movq (%rax), %rax 
    movq (%rax), %rdx 
    movq -24(%rbp), %rax 
    movq %rax, %rdi 
    call *%rdx    <<<=== 2 
    movl $0, %eax 
    addq $24, %rsp 
    popq %rbx 
    leave 
    ret 
    .cfi_endproc 

मेरे सवाल कर रहे हैं:

class A       
{        
    public:      
     virtual void show() {} 
};        

class B : public A    
{        
    public:      
     void show() {}   
};        


int main()      
{        
    A* pA = new B;    
    pA->show();     

    return 0;     
}        

अपने विधानसभा निम्नलिखित के रूप में है

  1. मैं NWM के लिए गूगल खोज की है, यह केवल मुझे बताता है कि C++ स्मृति आवंटित करने के लिए इसका उपयोग करता है, क्या कोई मुझे इसके बारे में और बता सकता है? क्या यह एक मुक्ति में है? यदि संभव हो, तो क्या मैं इसका स्रोत कोड प्राप्त कर सकता हूं? कैसे?
  2. मैं इस वाक्यविन्यास से काफी परिचित नहीं हूं, यह क्या करना चाहता है?
+2

पर आपका वर्चुअल फ़ंक्शन है, आपका कोड स्मृति, बीटीडब्ल्यू ... प्रत्येक नए को हटाए जाने के साथ मिलान किया जाना चाहिए ... – Goz

+4

@Goz: संभावना है कि एलेक्स पहले से ही यह जानता है और बस चाहता था एक [लघु, स्वयं युक्त, सही (संकलित), उदाहरण] बनाएं (http://meta.stackexchange.com/questions/22754/sscce-how-to-provide-examples-for-programming-questions)। –

+0

@ गोज़, मुझे लगता है कि मार्टिन लिवरेज ने पहले ही आपकी चिंता का उत्तर दिया है, मार्टिन को आपके उत्तर के लिए धन्यवाद और धन्यवाद मेरे लिए इसे इंगित करने के लिए गोज़ धन्यवाद। – Alex

उत्तर

11

* कॉल या कूद निर्देश के लिए एटी & टी विधानसभा वाक्य रचना में पूर्ण पतों से पहले किया जाता है। इसका मतलब है कि यह रजिस्टर में निहित पते पर कूद जाएगा। विकल्प एक सापेक्ष कूद है, जो वर्तमान निर्देश के सापेक्ष है।

GNU as manual से

:

& एटी टी निरपेक्ष (के रूप में पीसी रिश्तेदार के खिलाफ) कूद/कॉल ऑपरेंड द्वारा `* 'में लगाए जाते हैं; वे इंटेल सिंटैक्स में अवांछित हैं।

अपने कोड में यह एक रजिस्टर में पते के लिए कॉल करने के लिए समझ में आता है। कॉलिंग pA->show() को देखने के लिए एक नज़र डालने की आवश्यकता है कि सही फ़ंक्शन कहलाया जाना है। ऐसा इसलिए है क्योंकि यह कक्षा ए

+0

मैं यह सुनिश्चित करने के लिए यह लिख रहा हूं कि मैं इसे सही ढंग से समझता हूं। आपके द्वारा प्रदान किए गए लिंक के अनुसार, क्या इसका मतलब यह है कि वह उस फ़ंक्शन को कॉल करेगा जो उस रजिस्टर में संग्रहीत पते पर शुरू होता है? – Alex

+0

@GavinSmith, क्या एक रजिस्टर में एक ऑफसेट भी हो सकता है जिसे आप एक पूर्ण एड्रेस के बजाय कूद सकते हैं? अन्यथा यह उद्धरण वैसे भी समझ में नहीं आता है। – Devolus

+1

@ डेवोलस दोनों के लिए हाँ। मैंने इसे कवर करने के लिए अपना जवाब अपडेट कर दिया है। –

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