在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
}
}
我真的需要一种全球存储方式"对于可以从汇编程序和汇编程序访问的整数,我会很乐意为此提供任何帮助(或替代方法)。
答案 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
,请参阅CyberShadow的回答。 :)