2012-07-15 10 views
5

मुझे डी प्रोग्रामिंग भाषा में इनलाइन असेंबलर के साथ स्थिर वैरिएबल तक पहुंचने में कुछ परेशानी मिली है। प्रलेखन कहते हैं मैंडी इनलाइन असेंबलर: एक्सेस स्टेटिक वैरिएबल

mov EBX, this; 
mov EAX, var[EBX]; 

साथ

mov EAX, var[EBP]; //or mov EAX, var; 

और वर्ग चर के साथ स्थानीय चर का उपयोग करना है कि लेकिन यह कैसे एक स्थिर चर का उपयोग करने के दस्तावेज नहीं है। यहाँ मेरी कोड है कि एक त्रुटि फेंकता है:

module test; 

static int A = 1234; 

static void SetA() 
{ 
    asm 
    { 
     mov A, 5432; //compiles, but throws an error 
     //tried it with "mov dword ptr [A], 5432; too 
    } 
} 

मैं वास्तव में पूर्णांक है कि दोनों, कोडांतरक और डी से सुलभ हैं के लिए कुछ "वैश्विक भंडारण" का एक तरीका की जरूरत है, मैं इस के साथ किसी भी मदद के बारे में बहुत खुशी होगी (या एक वैकल्पिक तरीका)।

उत्तर

4

ग्लोबल वेरिएबल थ्रेड-स्थानीय स्टोरेज में डिफ़ॉल्ट रूप से डी 2 में रखे जाते हैं। "क्लासिक" स्थैतिक चर घोषित करने के लिए __gshared का उपयोग करें।

यह काम करता है:

module test; 

__gshared int A = 1234; 

void SetA() 
{ 
    asm 
    { 
     mov A, 5432; 
    } 
} 

unittest 
{ 
    SetA(); 
    assert(A == 5432); 
} 
+0

आपको धन्यवाद नहीं दे सकता है, यह अब काम करता है! –

+0

आप इस कोड को http://dpaste.dzfl.pl/ead5ed8e – DejanLekic

2

नोट: staticA पर अनावश्यक है, क्योंकि यह एक मॉड्यूल-स्तर चर है। मॉड्यूल-स्तरीय कार्यों के लिए वही।

डी में, मॉड्यूल-स्तरीय चर थ्रेड-स्थानीय स्टोरेज में जाते हैं। यदि आप वास्तव में चाहते हैं तो वैश्विक होने के लिए आपको एक चर को __gshared के रूप में चिह्नित करना होगा। इनलाइन असेंबली में टीएलएस चर का उपयोग करना पोर्टेबल फैशन में मूल रूप से संभव नहीं है।

एक तरह से तुम क्या चाहते करने के लिए:

module test; 

/*static*/ int A = 1234; 

/*static*/ void SetA() 
{ 
    int a; 

    asm 
    { 
     mov a, 5432; 
    } 

    A = a; 
} 

संपादित करें: आप __gshared इरादा है, तो CyberShadow के जवाब देखें। :)

+0

पर कार्रवाई में देख सकते हैं आप इस कोड को क्रिया में देख सकते हैं: http://dpaste.dzfl.pl/64f6a656 – DejanLekic

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