MASM:从汇编访问全局C变量

5

我正在编写一个程序,用于将图像转换并比较C和汇编处理数据的速度。 我有三个项目:

  • C语言中的主要项目
  • C语言中用于转换图像的DLL
  • 汇编语言中用于转换图像的DLL

在C DLL头文件中,我只是简单地写了:

#ifdef PROJEKTC_EXPORTS
    #define PROJEKTC_API __declspec(dllexport)
#else
    #define PROJEKTC_API __declspec(dllimport)
#endif

...

extern PROJEKTC_API unsigned int ThreadID;      

PROJEKTC_API void __cdecl funkcjaC(void* Args); 

在包含这个头文件后,我可以在主项目和C DLL中访问变量ThreadID。但是,在ASM中尝试执行相同操作时会出现问题。我试过在 .code 块中使用类似于“extern ASMThreadID:dword”这样的语法结构,但它不起作用。我得到的错误信息是“error LNK2019: unresolved external symbol _ASMThreadID referenced in function _MyProc1”。我感觉只需要修改一两行代码就可以解决问题,但我无法确定应该使用哪些指令。我通过在ASM中的模块定义文件中链接项目,并将ASM.lib文件添加到主项目的链接器->输入中来连接这些项目。你有什么建议吗?

编译 DLL 的 C 版本,让编译器生成汇编代码,并查看在我们的平台上是如何实现的?这些东西取决于具体实现。 - EOF
你是指反汇编窗口吗?我正在使用Windows 7 64位上的Visual Studio 2010,不幸的是它没有显示这部分代码的汇编... 我的意思是,在C DLL .c文件中,我有全局变量:PROJEKTC_API unsigned int ThreadID=0; 它运行得非常好。不幸的是,我不知道如何将变量从ASM导出到C。我应该在哪里和如何声明变量,以便它可以在DLL外部导出。如何在汇编中使用__declspec(dllexport)。 - Trimack
C语言有时会在名称中添加下划线。你尝试过在汇编中声明变量时添加下划线吗?而且你在汇编中将其声明为“public”了,对吗? - David Wohlferd
1个回答

6

在asmcommunity.net的旧帖子的帮助下,我设法让它工作:

  • 在.asm文件中,在.data段之前:

EXTERNDEF C ASMThreadID:DWORD

  • 在.data段中:

ASMThreadID dd 0

  • 在ASM DLL的.def文件中:

LIBRARY“nameOfProject” EXPORTS ... ASMThreadID

  • 在主C程序头文件中(如全局声明):

extern __declspec(dllimport) unsigned int ASMThreadID;

现在它像魅力一样工作。

“public”声明把我引向了正确的搜索方向。感谢您的帮助,伙计!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接