大家好。
我现在在写一个程序,使用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 中原来的声明方式,会在函数名后面再加上许多零零碎碎的修饰,应该是说明函数及其参数的特性,这样会比较难以使用。
------解决方案--------------------------------------------------------