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 变量基本上不可能以可移植的方式进行。

做你想做的一种方法:

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 回答