D内联汇编程序:访问静态变量

时间:2012-07-15 10:25:07

标签: assembly d inline-assembly

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

我真的需要一种全球存储方式"对于可以从汇编程序和汇编程序访问的整数,我会很乐意为此提供任何帮助(或替代方法)。

2 个答案:

答案 0 :(得分:4)

默认情况下,全局变量放在线程本地存储中的D2中。使用__gshared声明“经典”静态变量。

这有效:

module test;

__gshared int A = 1234;

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

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

答案 1 :(得分:2)

注意:static上的A是多余的,因为它是模块级变量。模块级函数也是如此。

在D中,模块级变量进入线程本地存储。如果确实希望变量为全局变量,则必须将变量标记为__gshared。以便携方式访问内联汇编中的TLS变量基本上是不可能的。

实现目标的一种方法:

module test;

/*static*/ int A = 1234;

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

    asm
    {
        mov a, 5432;
    }

    A = a;
}

修改:如果您打算__gshared,请参阅Cyber​​Shadow的回答。 :)