【问题标题】:C++ Function Calling Assembly ModuleC++ 函数调用汇编模块
【发布时间】:2011-06-02 13:16:51
【问题描述】:

我想在汇编中编写一个自定义模块并让我的 C++ 函数调用它。我不想从头开始,而是想用 C 编写“草稿”,让编译器生成蓝图汇编源,即 /FA 编译器选项生成的列表文件。

但是,我发现生成的所有过程名称都已经是修饰形式。此外,MASM将再次进行自己的名称装饰。因此,如果我在不首先手动取消修饰编译器生成的过程名称的情况下组装我的版本,我会收到链接器错误,因为函数名称不匹配。

是否可以防止这种重复的名称装饰?

【问题讨论】:

  • 问题真的和汇编无关?
  • 不要忘记大多数编译器都支持内联汇编。这可能会让你到达你需要去的地方,而不必担心 C++ 和汇编器之间的接口
  • 不,内联汇编不再是一个好的选择,除非不担心将其升级到 x64。 x64 不支持内联汇编,给旧代码带来了很多麻烦。
  • x64 编译器不支持内联汇编,因为它通常不需要,并且会干扰优化其余代码。你确定你真的可以比编译器做得更好吗?

标签: c++ masm name-decoration


【解决方案1】:

声明函数extern "C" 应该会导致生成的汇编器显示您应该在汇编器中使用的名称。只是不要忘记在标头中添加extern "C",以便稍后将其声明为 C++。

【讨论】:

  • 我尝试了外部“C”。正如另一个回复已经指出的那样,生成的名称只有一个前导 _。但是直接使用这个名字并没有帮助,因为 MASM 试图再次进行自己的装饰。我想避免手动编辑生成的名称。
  • 我对 MASM 不熟悉,所以我不能说,但如果没有办法生成你用extern "C" 得到的名字,那么你有一个真正的问题。
【解决方案2】:

您可以将您的函数声明为extern "C"。这样,它最多会在名称前加上一个下划线:

extern "C"{
  void foo(int bla){
  }
}

会变成

_foo

【讨论】:

    猜你喜欢
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    相关资源
    最近更新 更多