问题描述
使用 VS2019(32 位项目)
我尝试了什么:
- 在“构建自定义”中启用“.masm”
- 将“.asm”文件的类型设置为“Microsoft Macro Assembler”
- 将“保留标识符大小写”设置为“/Cp”-“保留标识符大小写”
- 在我的函数之前、之后和顶部放置一个`PUBLIC 我的函数名称
- 将“将所有符号标记为公开”设置为“是”
- 在“.asm”文件中的函数名称以及“.c”文件中的“extern”定义中添加/删除下划线。
- 将定义放在“.h”文件中。
这是我的工作方式(删除了实际的汇编代码,因为它无论如何都会发生):
程序集文件:
.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
现在可以完美运行了。