【问题标题】:how to reference global variable from C that was defined in .asm file in visual studio如何从 C 中引用在 Visual Studio 的 .asm 文件中定义的全局变量
【发布时间】:2021-01-26 04:34:07
【问题描述】:

我有一个定义变量 foo 的 .asm 文件

文件.asm:

.data
foo DWORD 0

.code
{ ... }

我想在 main.c 中的 file.asm 之外引用 foo,这是我尝试过的:

main.c

extern int foo;

int main()
{
    foo++;
}

但是这会导致链接器错误:LNK2001 unresolved external symbol foo,我如何从 main.c 引用它?

更新:

我也尝试过使用 PUBLIC 指令:

文件.asm:

.data
PUBLIC foo
foo DWORD 0

这会导致相同的链接器错误 LNK2001

【问题讨论】:

  • 究竟是什么编译行+错误?
  • @OrenIshShalom 编辑了问题以包含错误

标签: c assembly visual-c++ x86 masm


【解决方案1】:

MSVC 在符号名称的开头使用下划线,并且显然使用 PUBLIC 来导出符号(否则标签是内部的,如 C 中的 static 变量)。试试

.data
PUBLIC _foo
_foo DWORD 0

这本质上是 MSVC 本身所做的,请参阅 https://godbolt.org/z/Phb4Pv

【讨论】:

  • 请注意,Windows 上的 64 位代码不会在 asm 符号名称上使用前导 _,因此在这种情况下,您需要 public foo。这个答案对于 32 位代码是正确的。 (尽管使用零初始化器,您可以将其放在 BSS 中而不是 .data 中)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多