汇编导入C函数遇A2004:symbol类型冲突错误求助
解决汇编调用__stdcall C函数时的A2004类型冲突错误
问题根源
A2004类型冲突错误出在extern funcName1:far这行——flat内存模型下不存在near/far的区分,这个声明和实际__stdcall函数的类型不匹配。除此之外,参数传递方式和栈处理逻辑也存在问题。
具体修改方案
- 修正外部函数声明:把
extern funcName1:far改成extern funcName1:proc,flat模型下不需要far关键字,直接声明为proc类型即可。 - 对齐调用约定:C函数用的是
__stdcall,汇编代码里的.model flat, C默认是cdecl调用约定,改成.model flat, stdcall,让两者调用约定一致,避免栈处理混乱。 - 参数传值而非传地址:C函数的参数是int类型,之前push的是变量地址(offset),应该直接push变量的值,把
mov eax, offset numX; push eax改成push numX。 - 删掉手动清栈的pop指令:__stdcall约定下,被调用的C函数会自己清理栈(返回时用
ret 12释放3个int的12字节空间),手动pop三次ebx会导致栈不平衡。
修改后的完整代码
C代码(无需改动)
#include <stdio.h> int __stdcall funcName1(int a, int b, int c) { int answer = a*b-c; return answer; }
汇编代码
.586 .model flat, stdcall ; 匹配C函数的__stdcall调用约定 .stack .data num1 dd 2h num2 dd 2h num3 dd 1h extern funcName1:proc ; 正确声明外部函数类型 .CODE FuncName PROC push num3 ; 从右往左传参(第三个参数先入栈) push num2 push num1 call funcName1 ; 函数自动清栈,无需手动处理 ret FuncName ENDP END FuncName
内容的提问来源于stack exchange,提问作者Рубен Хачатрян
相关产品推荐
相关产品推荐

