You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编导入C函数遇A2004:symbol类型冲突错误求助

解决汇编调用__stdcall C函数时的A2004类型冲突错误

问题根源

A2004类型冲突错误出在extern funcName1:far这行——flat内存模型下不存在near/far的区分,这个声明和实际__stdcall函数的类型不匹配。除此之外,参数传递方式和栈处理逻辑也存在问题。

具体修改方案

  1. 修正外部函数声明:把extern funcName1:far改成extern funcName1:proc,flat模型下不需要far关键字,直接声明为proc类型即可。
  2. 对齐调用约定:C函数用的是__stdcall,汇编代码里的.model flat, C默认是cdecl调用约定,改成.model flat, stdcall,让两者调用约定一致,避免栈处理混乱。
  3. 参数传值而非传地址:C函数的参数是int类型,之前push的是变量地址(offset),应该直接push变量的值,把mov eax, offset numX; push eax改成push numX。
  4. 删掉手动清栈的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,提问作者Рубен Хачатрян

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 20:01:05