工具:VS2005  编译器:cl.exe(X86 C/C++)  ml64.exe(X64 ASM64)

前提:X86下内联汇编是嵌在函数当中实现的

在X86平台下,可以轻松的在C/C++代码中嵌入汇编代码,称其为“内联汇编”,使用”__asm{}”语法即可,比较简单,这里不做介绍。当你在X86平台下,由于性能和速度的要求,需要在C/C++代码中内联汇编。而当你好不容易在X86平台下实现了这些以后,发现要转到X64平台下面,怎么办(不是说在X64下运行X86的程序,因为这是肯定可以的,而是说从X86工程转到X64工程)?可以兼容的吧?先试试再说嘛。

试一试:

看到上图的Debug和Win32字眼么,就从这里开始改。

下拉Win32右端的下三角,呈现出如上图。由于我已经设置好了,会有x64字眼。如果以前没有设置,那么默认是没有x64字样的。要出现x64平台,请设置:点击“配置管理器”,一系列操作见图知意:

注意:一般情况下,是在X86平台下编程,至少我是这样的。那么装VS2005的时候默认是不支持在X86平台下编译连接生成X64平台的EXE的。如果真的要在X86下编译连接生成X64平台的EXE,比如和我一样。那么找到您安装VS2005时候的SETUP.EXE,双击它,选择“添加或者删除”选项(名字不确定,但是是第一项),然后勾选住有X64字眼的那一项(具体我也不记得了),然后等SETUP.EXE帮你装上这一项就好了。接下来看图~

注意:当你第一次“新建”的时候,在“新建平台(P)”下会出现“X64”选项,这里没有出现,因为我之前已经都设置好了。

都说了试一试了,结果上面才弄好了环境设置。下面编译连接(F7),啊哦!出错了,而且一大堆错误提示!妈呀!!!

经典的一句报错是:

error C4235: 使用了非标准扩展: 不支持在此结构上使用“__asm”关键字

完蛋了!想办法咯~

上网求解方案,说VS2005 X64平台下不再支持内联汇编了!但是考虑到时间,又不允许换编译器,怎么办?继续上网搜索解决方法。。。有了。单独写汇编ASM文件,编译生成.OBJ文件。也就是说不能在C/C++代码中直接内嵌(内联)汇编了,而要把原先内联的汇编全都放在一个独立的汇编文件中。换句话说,一部分汇编代码,一部分C/C++代码。然后将独立汇编编译生成的.OBJ文件附加到C/C++主工程之中。。。好像好难哦,没事,万事开头难嘛~

好的,不懂的话先往下看了!

下面还有一些头大的操作那

记住,我是在X86平台下编译连接X64平台下的程序哦!主工程是在X64平台下运行的程序。上面说的两部分:汇编和C/C++当然是X64平台下的(肯定的嘛)。

64位汇编,傻眼了,32位都头大,一下子跳到64位,有没有搞错??没有,32位汇编代码应该是不用做太大的改动的。事实上证明,确实是这样的哦~

首先,不是把原先的内联汇编代码改成单独的汇编文件。问题是写好了64位汇编,怎么编译单独的汇编文件?用VS2005集成环境去编译单独的汇编文件,对,就是这样,不要再回到DOS界面敲命令行了,这会死人的,而且不方便!!接下来跟着我做:

用VS2005建立一个常规的空项目。然后将自己改好的64位汇编(说白了,大部分还是32位的指令)加入该工程中,F7编译连接好像有反应,但是是假象!默认的话IDE不认识汇编。怎么办?

点击“自定义生成规则”:

默认只有前两项,最后一项是我自己添加的。第一项,我不知道什么东西。第二项是32汇编的编译器(ml.exe)。但是我们是要编译64位汇编啊!不急,按着下面做:

找到这个路径“…\Program Files\Microsoft Visual Studio 8\VC\VCProjectDefaults”,OK,在这个目录下,找到masm.rules。接下来,复制粘贴masm.rules,改复制文件名字为“masm64.rules”。

回到IDE,上面就有了三项了。对最后一项进行修改,明显的,不然后两项是一样的。勾选第三项,点击“修改规则文件”:

点击“修改生成规则”:

改成蓝色选中的文字就行了,就是简单的加了“64”在原先ml后面,你懂的~一路确定,万事搞定!如果64位汇编文件没有语法错误,就会生成.OBJ文件了,哈哈!没有这么简单的啦。。。主要是编写符合要求的64位汇编代码,而不是以前简单的内联在C/C++代码中。关于编写单独汇编代码文件,靠你原先的汇编基础了,这个我没话说了,靠你们自己了!!

OK,“搞定了”,F7如下提示:

1>------ 已启动生成: 项目: ASM64, 配置: Debug x64 ------

1>正在链接...

1>LINK : fatal error LNK1561: 必须定义入口点

1>生成日志保存在“file://f:\VC Projects\Visual Studio 2005 Projects\happyway\test\ASM64\ASM64\x64\Debug\BuildLog.htm”

1>ASM64 - 1 个错误,个警告

========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过==========

我没有去深究入口点,因为我不需要这个,入口点在C/C++主工程那,汇编搞定,语法上!得到了编译生成的asm64.obj。

接下来,是另一部分,C/C++主工程代码了,停笔,和田大头吃饭去~

……

我X,田大头放我鸽子,一个人吃饭!

注意,X86下内联汇编是嵌在函数当中实现的,所以上面的64位汇编的任务就是编写函数过程(PROC)。

接下来,回到主工程。在主工程中要用到汇编中的函数,那么汇编生成的.OBJ文件就派上用场了。主工程可以调用.OBJ去使用汇编中的函数。过程如下:

“项目”->“属性”,弹出:

然后“配置属性”->”链接器”->“输入”,,右侧的“附加依赖项”中,填入汇编文件生成的.OBJ,如下图。

然后暴露出汇编中编写好的函数的接口。

我是这样暴露我的汇编函数的:

extern "C" int __stdcall  RGB2YUV_ALL(int bmpWidth,int bmpHeight,unsigned char *videoRef,unsigned char*YUVData);

extern "C" int __stdcall  RGB2YUV_BLOCK(int bmpWidth,int bmpHeight,unsigned char *videoRef,unsigned char*YUVData,int LargebmpWidth);

如果一切顺利的话,主工程就可以使用上面的函数,编译连接都没有问题,但是万恶的运行时有错,那就得靠你的调试了!至此,差不多,从X86到X64,从内联汇编到单独的汇编文件,解决了X64下不支持内联汇编的问题啦,嘻嘻。

但是,更加辛苦和耗时的是汇编代码的修改和编写、C/C++调用汇编函数过程遇到的种种问题,但是只要努力再加上有一定基础的情况下是搞得定许多问题的!

如果你感兴趣,或者就是和我一样碰到这样的问题,下面给出实例代码。

1. ASM文件

.data

;数据段

.code

FUNC proc

MOV EAX, 1234

RET

FUNC endp

end

2.测试VS2005控制台工程

#include

extern "C" int __stdcall  FUNC();

int main(int argc, WCHAR* argv[])

{

int nret = FUNC();

printf(“%d\n”, nret);

system("pause");

return 0;

}

这其中的过程,还有很多需要解决的问题和思考的地方,这需要你的基本功了,就不在这里都说出来了,做一做就都知道了!相信自己!

mupdf不支持x64_x86平台转x64平台关于内联汇编不再支持的解决相关推荐

  1. VS2015默认不支持x64下__asm{}内联汇编的解决方案(含资源共享)

    截至目前(2018年底2019年初),本人windows平台下的各种开发所用的IDE主要就是VS2015.虽然VS2017已经出来一年多了,本人也自己使用过一段时间,但没发现特别大的亮点,又考虑到整个 ...

  2. Visual studio 默认不支持x64下__asm{}内联汇编的解决方案(含资源共享)

    Windows下使用内联汇编方法很简单.使用 __asm 关键词结构作为制导就可以. __asm{ // Assembly Codes here } 但是,Visual Studio目前只支持32位( ...

  3. VS 编写 x64 内联汇编

    From:https://www.cnblogs.com/talenth/p/9135626.html VS 中使用 X64 汇编:https://blog.csdn.net/kingswb/arti ...

  4. x64内联汇编解决办法

    之前一直在x32上内联汇编用着好好的,五一换了电脑,win10 x64,想在一个点停下,结果在用__asm{}的时候vs2015报错说在本结构上不支持该拓展--一路慢慢Google vs2015 co ...

  5. x86 和 x64平台下数据类型大小

    x86平台 x64平台 从以上测试可知,不管是x86平台还是x64平台,int类型大小都是32位4个字节 http://msdn.microsoft.com/en-us/library/aa38375 ...

  6. ZLMS教学管理平台系统V1.2.0最新版本发布,支持纯Web视频直播点播,还带运营在线支付功能!完全免费提供!...

    ZLMS教学管理平台系统V1.2.0最新版本发布,支持纯Web视频直播,点播!还带在线支付功能! ZLMS 开发团队在综合参考了各方面的合理建议之后,经过两个多月的紧张开发及测试,终于发布V1.2.0 ...

  7. x86汇编代码转x64平台使用(VS2010测试通过)最简单的方法

    众所周知,在x86平台,可以直接使用__asm 内嵌汇编代码,然而在x64平台却不行了. 现在解决这个问题. 一.VS中创建控制台程序,改成x64平台启动. 二.创建test.asm文件.将原先的汇编 ...

  8. 打印机怎么选择双面打印,支持双面打印资料的平台

    使用打印机怎么选择双面打印?双面打印在我们日常打印时都是比较常用的,选择双面打印可以节省打印的费用,提高打印纸张的利用率,但是并不是每一个打印店都支持为大家双面打印资料,有些打印平台是不支持双面打印的 ...

  9. 视频监控安防平台-国标28181平台(支持国标28181转RTSP/RTMP/HLS/WEBRTC直播)

    视频监控安防平台-国标28181平台(支持国标28181转RTSP/RTMP/HLS/WEBRTC直播) 发现很久都未更新博客了,最近把小平台的功能做了完善,在原来的功能基础上添加了功能,支持国标28 ...

最新文章

  1. 京东零售CEO徐雷升任京东集团总裁,刘强东:将把更多时间投入乡村振兴等事业中...
  2. Bloomfilter 的应用场景
  3. 关于yield的一些资料
  4. 在成长中遇到的挫折事件对你的影响_多种语言环境中成长的宝宝,会影响说话早晚?其实没有想象的复杂...
  5. 关于多个router-view视图组件,渲染同一页面
  6. 女人用一辈子承诺一句话
  7. opencv-api drawContours
  8. “安防+人工智能”,安企选择哪种抱大腿姿势才有出息?
  9. python基础数据类型语法
  10. 跨浏览器resize事件分析
  11. 记第十七次CCF CSP认证
  12. Windows系统文件浏览标签窗口工具
  13. 【Jectpack】DataStore
  14. Android P cdd(Android 兼容性定义文档)
  15. 探访IBM企业级区块链-CSDN公开课-专题视频课程
  16. 原生js与css3实现简单翻页动画
  17. fluent p1模型_FLUENT模型选择
  18. 统一自定义idea和eclipse代码格式化和注释格式化总结
  19. GB2312 编码(转)
  20. 计算机专业教师资格证教学设计,教师资格证教案

热门文章

  1. 数据科学学习课件:实用数据挖掘与人工智能
  2. Python学习笔记:进程和线程(起)
  3. Linux下必须知道的11个网络命令
  4. [云炬创业学笔记]第一章创业是什么测试3
  5. [云炬创业基础笔记] 第四章测试3
  6. [云炬python3玩转机器学习笔记] 1-3课程所使用的主要技术栈
  7. < Android数据存储> 任务二 应用程序数据文件夹里的文件读写
  8. 机器学习碎碎念:霍夫丁不等式
  9. 无法解析的外部符号 __imp____glutInitWithExit@12
  10. VirtualBox使用技巧