汇编函数与c函数的相互调用

汇编函数与c函数的相互调用

ID:9355350

大小:26.17 KB

页数:20页

时间:2018-04-28

汇编函数与c函数的相互调用_第1页
汇编函数与c函数的相互调用_第2页
汇编函数与c函数的相互调用_第3页
汇编函数与c函数的相互调用_第4页
汇编函数与c函数的相互调用_第5页
资源描述:

《汇编函数与c函数的相互调用》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、昨天好好研究了一下内嵌汇编的情况。。。。。更进一步的,该是看看独立编译的汇编程序与C/C++互相调用的情况了。呵呵,最近怎么好像老在搞这个,想当年学习的时候,一门心思的学C++,到现在老是在弄诸如怎么在C/C++中调用LUA函数,或者反过来,怎么C/C++中调用Python函数,或者反过来,今天又是怎么在C/C++中调用汇编的函数,或者反过来。。。。。。。。。。。。。呵呵,自从学习的语言越来越多,类似的情况碰到的也就越来越多了,但是,只懂一门语言就不能在合适的时候使用合适的语言来解决问题,并且看问题会带有狭隘的偏见,谁说的来

2、着?毕竟无论是lua,python,asm都会有用的上的时候,我最近似乎老是喜欢说闲话。。。。这是某些哥们说的自己的见解,还是某些时候无聊的牢骚呢?谁知道呢,过年了嘛,还不让人多说几句话啊。。。。。。-_-!首先来看C中调用汇编的函数先添加一个汇编文件写的函数吧,在VS2005中对此有了明显的进步,因为就《加密与解密》一书描述,在2003中需要自己配置编译选项,但是在VS2005中很明显的,当你添加asm文件后,可以自己选定masm的编译规则,然后一切就由IDE把你做好了,这也算是IDE的一个好用的地方吧。。。。非常不好的一

3、点就是,VS2005中对于汇编没有任何语法高亮。。。。damnit!IDE怎么做的?就这点而言,其甚至不如一般的文本编辑工具!。。。又是废话了。。因为是C,这个目前全世界可能是最具有可移植性的语言,所以问题要简单的多。但是。。。也不全是那么简单,先看看直觉的写法:汇编代码:PUBLICGetArgument.486                      ;create32bitcode.modelflat       ;32bitmemorymodel;optioncasemap:none      ;casesensi

4、tive_TEXTSEGMENTPUBLIC'CODE'GetArgumentPROC    MOVEAX,[ESP+4]    RETNGetArgumentENDP_TEXTENDSEND C语言代码:#include #include  int GetArgument(int);int _tmain(int argc, _TCHAR* argv[]){     printf("%d/n",GetArgument(10));     system("PAUSE");     ret

5、urn 0;} 声明是必不可少的,毕竟汇编没有头文件给你包含,不过多的话,可以考虑组织一个专门用于包含汇编函数实现的头文件。但是在编译时却不会通过。1>InlineAsm.obj:errorLNK2001: 无法解析的外部符号_GetArgument1>    D:/MyDocument/VisualStudio2005/Projects/InlineAsm/Release/InlineAsm.exe:fatalerrorLNK1120:1 个无法解析的外部命令看到错误原因也知道是怎么回事了,C中的函数名被编译器处理时多了个

6、前置的下划线,当然,这个问题好解决。一种方式是改变汇编代码的函数,直接添加一个前置下划线就完了,一种方式是将其声明为C语言的方式,那么链接程序也知道正确的链接了。两种方式分别如下:直接改变函数名:PUBLIC_GetArgument.486                      ;create32bitcode.modelflat       ;32bitmemorymodel;optioncasemap:none      ;casesensitive_TEXTSEGMENTPUBLIC'CODE'_GetArgume

7、ntPROC    MOVEAX,[ESP+4]    RETN_GetArgumentENDP_TEXTENDSEND 改变.model声明:PUBLICGetArgument.486                      ;create32bitcode.modelflat,c       ;32bitmemorymodel;optioncasemap:none      ;casesensitive_TEXTSEGMENTPUBLIC'CODE'GetArgumentPROC    MOVEAX,[ESP+4]  

8、  RETNGetArgumentENDP_TEXTENDSEND 个人推荐第2种方式,因为看起来最舒服,将改变函数名的工作交给编译和链接程序吧。假如是在C++中调用ASM函数的话,相对复杂一点,因为没有.modelC++的生命方式。。。这个世界是不公平对待C和C++的。。。。呵呵,但是C

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。