2011-06-03 5 views
6

मैं अभी भी जीसीसी के साथ लड़ रहा हूँ है नहीं ले सकते - -fasm-ब्लॉक, जो सक्षम बनाता है के साथ निम्नलिखित इनलाइन विधानसभा कोड (संकलन इंटेल शैली विधानसभा वाक्य रचना) मेरे एक अजीब त्रुटि नेट्स इस 'का पता है, जो एक rvalue अभिव्यक्ति है नहीं ले सकते ...जीसीसी इनलाइन विधानसभा त्रुटि: 'इस' का पता है, जो एक rvalue अभिव्यक्ति

MyClass::MyFunction() 
{ 
    _asm 
    { 
     //... 
     mov ebx, this // error: Cannot take the address of 'this', which is an rvalue expression 
     //... 
     mov eax, this // error: Cannot take the address of 'this', which is an rvalue expression 
     //... 
    }; 
} 


क्यों मैं रजिस्टरों में विभिन्न वस्तुओं की ओर इशारा स्टोर कर सकते हैं, लेकिन उपयोग नहीं कर सकते हैं पॉइंटर MyClass उदाहरण?

+0

बस एक विचारधारा, 'लीए ईबीएक्स, [यह]' के बारे में क्या? – Xeo

उत्तर

1

क्योंकि संकलक, एक स्मृति सेल एक रजिस्टर (आम तौर पर ECX) के बजाय में this स्टोर करने के लिए अनुकूलन प्रयोजनों के लिए अपने आप ही तय कर सकते हैं, या यह कि क्या करना चाहिए क्योंकि calling convention स्पष्ट रूप से निर्दिष्ट करता है यही कारण है कि।

उस स्थिति में, आप इसका पता नहीं ले सकते हैं, क्योंकि पंजीयक पता योग्य स्मृति नहीं हैं।

+1

असल में, मैंने स्थानीय सूचक MyClass * p = बनाकर समस्या हल की और ऐसा लगता है कि यह काम कर रहा है ... – Ryan

1

आप कुछ इस तरह का उपयोग कर सकते हैं:

#include <stdio.h> 

class A{ 
public: 
    void* work(){ 
     void* result; 
     asm("mov %%eax, %%eax" 
      : "=a" (result) /* put contents of EAX to result*/ 
      : "a"(this)  /* put this to EAX */ 
      ); 
     return result; 
    } 
}; 


int main(){ 
    A a; 
    printf("%x - %x\n", &a, a.work()); 
} 

इनलाइन एएसएम को गुजर ऑपरेंड here

+0

धन्यवाद, लेकिन क्या आप वाकई कोई दूसरा रास्ता नहीं हैं? – Ryan

0

व्यवहार में पर और विवरण देखें, प्रत्येक कार्यान्वयन के साथ एएसएम को संबंध अपने नियम को परिभाषित करता है। जी ++ के मामले में, ऐसा लगता है कि जब आप mov ebx, something लिखते हैं, तो निर्देश उत्पन्न करने के लिए g ++ को something के पते की आवश्यकता होती है। (आश्चर्य की बात नहीं है, वास्तव में, असेंबलर काम करते हैं।) this कोई पता नहीं है। (यह एक रैल्यू का मतलब है।) कार्यान्वयन this को इनलाइन असेंबलर में विशेष केस के रूप में इलाज कर सकता है, और कोड में स्पॉट पर उचित जो भी हो, उसे प्रतिस्थापित कर सकता है। g ++ ऐसा नहीं करता है, संभवतः क्योंकि इसमें अन्य, अधिक सामान्य तंत्र (big_george का समाधान) है जो समस्या को संभालता है।