无法将 MASM 函数导入 C

问题描述

使用 VS2019(32 位项目)

我尝试了什么:

  • 在“构建自定义”中启用“.masm”
  • 将“.asm”文件的类型设置为“Microsoft Macro Assembler”
  • 将“保留标识符大小写”设置为“/Cp”-“保留标识符大小写”
  • 在我的函数之前、之后和顶部放置一个`PUBLIC 我的函数名称
  • 将“将所有符号标记为公开”设置为“是”
  • 在“.asm”文件中的函数名称以及“.c”文件中的“extern”定义中添加/删除下划线。
  • 将定义放在“.h”文件中。

似乎没有任何效果,我不断收到 LNK2001 错误

这是我的工作方式(删除了实际的汇编代码,因为它无论如何都会发生):

程序集文件

.model flat,stdcall
.stack 4096
.code

MyFunction proc
push ebp
mov ebp,esp
mov eax,[ebp+08h]
;...
pop ebp
ret 04h
MyFunction endp

end

C 文件

extern void __stdcall MyFunction(unsigned int x);

解决方法

我已经解决了我的问题。

在我的情况下,我没有装饰指令的事实似乎不是问题,问题是 MASM 不知道我的函数有多少参数,所以装饰符号是 _MyFunctionName@0

我首先为我的函数添加了一个带有参数的原型: MyFunction proc stdcall x:DWORD

但问题是 MASM 会为我的函数生成自己的序言和尾声,这会搞砸堆栈,所以我还在文件顶部添加了以下几行:

option prologue:none
option epilogue:none

现在可以完美运行了。