【问题标题】:linking assembly and c problem链接汇编和c问题
【发布时间】:2009-12-13 15:34:07
【问题描述】:

试图了解如何链接结构中定义的函数,该函数在汇编代码中,并试图从 c 中调用它。我认为在调用该函数时缺少一个步骤,因为我得到了一个未解析的外部符号...

;Assembly.asm
.686p
.mmx
.xmm
.model flat

include Definitions.inc

.code

?Initialize@Foo@@SIXPAUFee@@@Z proc
    jmp $
?Initialize@Foo@@SIXPAUFee@@@Z endp

end



//CFile.c
struct Fee
{
   signed long id; 
}

struct Foo
{
   static void Initialize(Fee *);
}


int startup(Fee * init)
{
  Foo::Initialize(init); //<-- This is unresolved
  return 0;
}

【问题讨论】:

  • 您是否要向 C++ 公开一个 asm 函数?

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


【解决方案1】:

您的汇编代码定义了一个函数,其修饰名称解码为

public: static void __fastcall Foo::InitializeCurrentCpu(struct Fee *)

通过 undname.exe 实用程序获得。 Foo::InitializeCurrentCpu() 与 Foo::Initialize() 不匹配,名称不匹配。调用约定也没有。

首先用 C++ 编写此代码,然后查看 .map 文件以获取正确的修饰名称。或者用 extern "C" 声明函数来抑制 C++ 修饰。

【讨论】:

  • 刚刚意识到我打错了它的 ?Initialize@Foo@@SIXPAFee@@@Z proc 而不是 ?InitializeCurrentCpu@Foo@@SIXPAUFee@@@Z proc
  • 您的调用约定仍然不匹配。
  • 我究竟在哪里进行更改?在 Foo 结构中?格式是否应该与您编写的示例完全相同...我得到类似 public: static void __cdecl Foo::Initialize(struct Fee *)
  • 工作...我只需要添加 __fastcall 而不是 __cdecl
猜你喜欢
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
相关资源
最近更新 更多