- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
昨天好好研究了一下内嵌汇编的情况。。。。。更进一步的,该是看看独立编译的汇编程序与C/C++互相调用的情况了。呵呵,最近怎么好像老在搞这个,想当年学习的时候,一门心思的学C++,到现在老是在弄诸如怎么在C/C++中调用LUA函数,或者反过来,怎么C/C++中调用Python函数,或者反过来,今天又是怎么在C/C++中调用汇编的函数,或者反过来。。。。。。。。。。。。。呵呵,自从学习的语言越来越多,类似的情况碰到的也就越来越多了,但是,只懂一门语言就不能在合适的时候使用合适的语言来解决问题,并且看问题会带有狭隘的偏见,谁说的来着?毕竟无论是lua,python,asm都会有用的上的时候,我最近似乎老是喜欢说闲话。。。。这是某些哥们说的自己的见解,还是某些时候无聊的牢骚呢?谁知道呢,过年了嘛,还不让人多说几句话啊。。。。。。-_-!首先来看C中调用汇编的函数先添加一个汇编文件写的函数吧,在VS2005中对此有了明显的进步,因为就《加密与解密》一书描述,在2003中需要自己配置编译选项,但是在VS2005中很明显的,当你添加asm文件后,可以自己选定masm的编译规则,然后一切就由IDE把你做好了,这也算是IDE的一个好用的地方吧。。。。非常不好的一点就是,VS2005中对于汇编没有任何语法高亮。。。。damnit!IDE怎么做的?就这点而言,其甚至不如一般的文本编辑工具!。。。又是废话了。。因为是C,这个目前全世界可能是最具有可移植性的语言,所以问题要简单的多。但是。。。也不全是那么简单,先看看直觉的写法:汇编代码:PUBLIC GetArgument.486??????????????????????; create 32 bit code.model flat???????; 32 bit memory model;option casemap :none??????; case sensitive_TEXT SEGMENT PUBLIC CODEGetArgument PROC????MOV EAX, [ESP+4]????RETNGetArgument ENDP_TEXT ENDSEND?C语言代码:#include?stdio.h#include?windows.h?int?GetArgument(int);int?_tmain(int?argc,?_TCHAR*?argv[]){?????printf(%d/n,GetArgument(10));?????system(PAUSE);?????return?0;}?声明是必不可少的,毕竟汇编没有头文件给你包含,不过多的话,可以考虑组织一个专门用于包含汇编函数实现的头文件。但是在编译时却不会通过。1InlineAsm.obj : error LNK2001:?无法解析的外部符号_GetArgument1????D:/My Document/Visual Studio 2005/Projects/InlineAsm/Release/InlineAsm.exe : fatal error LNK1120: 1?个无法解析的外部命令看到错误原因也知道是怎么回事了,C中的函数名被编译器处理时多了个前置的下划线,当然,这个问题好解决。一种方式是改变汇编代码的函数,直接添加一个前置下划线就完了,一种方式是将其声明为C语言的方式,那么链接程序也知道正确的链接了。两种方式分别如下:直接改变函数名:PUBLIC _GetArgument.486??????????????????????; create 32 bit code.model flat???????; 32 bit memory model;option casemap :none??????; case sensitive_TEXT SEGMENT PUBLIC CODE_GetArgument PROC????MOV EAX, [ESP+4]????RETN_GetArgument ENDP_TEXT ENDSEND?改变.model声明:PUBLIC GetArgument.486??????????????????????; create 32 bit code.model flat,c???????; 32 bit memory model;option casemap :none??????; case sensitive_TEXT SEGMENT PUBLIC CODEGetArgument PROC????MOV EAX, [ESP+4]????RETNGetArgument ENDP_TEXT ENDSEND?个人推荐第2种方式,因为看起来最舒服,将改变函数名的工作交给编译和链接程序吧。假如是在C++中调用A
原创力文档


文档评论(0)