2012-07-15 11 views
5

Dプログラミング言語でインラインアセンブラを使用して静的変数にアクセスする際に問題が発生しました。ドキュメントは、私がDインラインアセンブラ:静的変数へのアクセス

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

私は本当に両方からアクセス可能な整数のためのいくつかの「グローバルストレージ」、アセンブラおよびDの方法を必要とする、私はこれで任意のヘルプについて非常に幸せになります(または別の方法)。

答えて

4

グローバル変数は、デフォルトではD2にスレッドローカルストレージに配置されます。 __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

注:それはモジュールレベルの変数なので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

関連する問題