首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

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

2012-02-19 
C 语言调用汇编模块链接错误大家好。我现在在写一个程序,使用C语言调用汇编程序中的过程。1.汇编部分代码.48

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语言引用外部符号,编译时会自动加个“_”。如果不在汇编里引用的变量或过程前加"_",会提示找不到。

去了后也是不行的。

热点排行