5

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

2 に答える 2

4

D2では、グローバル変数はデフォルトでスレッドローカルストレージに配置されます。__gshared「クラシック」静的変数を宣言するために使用します。

これは機能します:

module test;

__gshared int A = 1234;

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

unittest
{
    SetA();
    assert(A == 5432);
}
于 2012-07-15T10:27:34.767 に答える
2

注: staticonAはモジュール レベルの変数であるため、冗長です。モジュールレベルの関数についても同じです。

D では、モジュール レベルの変数はスレッド ローカル ストレージに格納されます。本当にグローバルにしたい__gshared場合は、変数をマークする必要があります。インライン アセンブリで TLS 変数にアクセスすることは、基本的に移植可能な方法では不可能です。

あなたが望むことをする1つの方法:

module test;

/*static*/ int A = 1234;

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

    asm
    {
        mov a, 5432;
    }

    A = a;
}

編集: 意図した場合は__gshared、Cyber​​Shadow の回答を参照してください。:)

于 2012-07-15T10:31:15.223 に答える