2012-07-15 80 views
5

我在D編程語言中使用內聯彙編程序訪問靜態變量時遇到了一些麻煩。該文件說,我要訪問的局部變量與D內聯彙編程序:訪問靜態變量

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

和類變量與

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

但它不是記錄如何訪問一個靜態變量。這裏是我的代碼拋出一個錯誤:

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 
    } 
} 

我真的需要一些「全球存儲」的方式爲從兩個,彙編器和d訪問的整數,我將有關與此的任何幫助,很高興(或另一種方式)。

回答

4

默認情況下,全局變量置於D2中的線程本地存儲中。使用__gshared來聲明一個「經典」靜態變量。

這工作:

module test; 

__gshared int A = 1234; 

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

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

不能謝謝你,它現在的作品! – 2012-07-15 10:30:23

+0

你可以在http://dpaste.dzfl.pl/ead5ed8e – DejanLekic 2012-07-15 17:08:45

2

注:Astatic是多餘的,因爲它是一個模塊級變量。模塊級功能也一樣。

在D中,模塊級變量進入線程本地存儲。如果您真的需要想要它是全球性的,您必須將變量標記爲__gshared。在內聯彙編中訪問TLS變量基本上不可能以便攜的方式進行。

一種方式做你想要什麼:

module test; 

/*static*/ int A = 1234; 

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

    asm 
    { 
     mov a, 5432; 
    } 

    A = a; 
} 

編輯:如果你打算__gshared,則見Cyber​​Shadow的答案。 :)

+0

看到這個代碼的實際操作你可以在http://dpaste.dzfl.pl/64f6a656 – DejanLekic 2012-07-15 17:08:04