当前位置: 代码迷 >> 汇编语言 >> C 语言调用汇编模块链接异常
  详细解决方案

C 语言调用汇编模块链接异常

热度:7617   发布时间:2013-02-26 00:00:00.0
C 语言调用汇编模块链接错误
大家好。
我现在在写一个程序,使用C语言调用汇编程序中的过程。

1.汇编部分代码
.486
.MODEL FLAT, STDCALL
OPTION CASEMAP:NONE

PUBLIC _SetEKey

.CODE
_SetEKey PROC C USES EAX EBX ESI EDI key:DWORD, roundkey:DWORD, bits:DWORD
  ....
_SetEKey ENDP

2.C语言部分代码
extern void SetEKey(unsigned char *key, unsigned char *roundkey, int bits);
int main(void)
{
  ......
  SetEKey(key,roundkey,128); //调用汇编过程
  ......
}

使用ml.exe 将汇编程序编译成.obj文件,然后添加到VC 6.0工程中,但用VC 6.0编译C程序没有错误,链接时出现下面的错误:

error LNK2001: unresolved external symbol _SetEKey
Debug/AES.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

------解决方案--------------------------------------------------------
.cpp 中的函数声明改为:
extern "C" { void WINAPI SetEKey(unsigned char *key, unsigned char *roundkey, int bits); }

.asm 中将 _SetEKey 改为 SetEKey@12

这样编译链接全通过了。通过 Hiew 查看最后的 exe 文件,对 asm 这的 SetEKey 函数调用也是对的。

cpp 中原来的声明方式,会在函数名后面再加上许多零零碎碎的修饰,应该是说明函数及其参数的特性,这样会比较难以使用。
------解决方案--------------------------------------------------------
探讨

引用:
你汇编里面SetEKey前面干吗加_,去掉这个_然后再试。

网上这么说的,C语言引用外部符号,编译时会自动加个“_”。如果不在汇编里引用的变量或过程前加"_",会提示找不到。

去了后也是不行的。
  相关解决方案