x86平台转x64平台关于内联汇编不再支持的解决Word文件下载.docx
- 文档编号:18613423
- 上传时间:2022-12-29
- 格式:DOCX
- 页数:12
- 大小:459.13KB
x86平台转x64平台关于内联汇编不再支持的解决Word文件下载.docx
《x86平台转x64平台关于内联汇编不再支持的解决Word文件下载.docx》由会员分享,可在线阅读,更多相关《x86平台转x64平台关于内联汇编不再支持的解决Word文件下载.docx(12页珍藏版)》请在冰豆网上搜索。
看到上图的Debug和Win32字眼么,就从这里开始改。
下拉Win32右端的下三角,呈现出如上图。
由于我已经设置好了,会有x64字眼。
如果以前没有设置,那么默认是没有x64字样的。
要出现x64平台,请设置:
点击“配置管理器”,一系列操作见图知意:
注意:
一般情况下,是在X86平台下编程,至少我是这样的。
那么装VS2005的时候默认是不支持在X86平台下编译连接生成X64平台的EXE的。
如果真的要在X86下编译连接生成X64平台的EXE,比如和我一样。
那么找到您安装VS2005时候的SETUP.EXE,双击它,选择“添加或者删除”选项(名字不确定,但是是第一项),然后勾选住有X64字眼的那一项(具体我也不记得了),然后等SETUP.EXE帮你装上这一项就好了。
接下来看图~
当你第一次“新建”的时候,在“新建平台(P)”下会出现“X64”选项,这里没有出现,因为我之前已经都设置好了。
都说了试一试了,结果上面才弄好了环境设置。
下面编译连接(F7),啊哦!
出错了,而且一大堆错误提示!
妈呀!
!
经典的一句报错是:
errorC4235:
使用了非标准扩展:
不支持在此结构上使用“__asm”关键字
完蛋了!
想办法咯~
上网求解方案,说VS2005X64平台下不再支持内联汇编了!
但是考虑到时间,又不允许换编译器,怎么办?
继续上网搜索解决方法。
。
有了。
单独写汇编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位汇编啊!
不急,按着下面做:
找到这个路径“…\ProgramFiles\MicrosoftVisualStudio8\VC\VCProjectDefaults”,OK,在这个目录下,找到masm.rules。
接下来,复制粘贴masm.rules,改复制文件名字为“masm64.rules”。
回到IDE,上面就有了三项了。
对最后一项进行修改,明显的,不然后两项是一样的。
勾选第三项,点击“修改规则文件”:
点击“修改生成规则”:
改成蓝色选中的文字就行了,就是简单的加了“64”在原先ml后面,你懂的~一路确定,万事搞定!
如果64位汇编文件没有语法错误,就会生成.OBJ文件了,哈哈!
没有这么简单的啦。
主要是编写符合要求的64位汇编代码,而不是以前简单的内联在C/C++代码中。
关于编写单独汇编代码文件,靠你原先的汇编基础了,这个我没话说了,靠你们自己了!
OK,“搞定了”,F7如下提示:
1>
------
已启动生成:
项目:
ASM64,
配置:
Debugx64------
正在链接...
LINK:
fatalerrorLNK1561:
必须定义入口点
生成日志保存在“file:
//f:
\VCProjects\VisualStudio2005Projects\happyway\test\ASM64\ASM64\x64\Debug\BuildLog.htm”
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,
bmpHeight,
unsigned
char
*videoRef,
char*YUVData);
RGB2YUV_BLOCK(int
char*YUVData,
LargebmpWidth);
如果一切顺利的话,主工程就可以使用上面的函数,编译连接都没有问题,但是万恶的运行时有错,那就得靠你的调试了!
至此,差不多,从X86到X64,从内联汇编到单独的汇编文件,解决了X64下不支持内联汇编的问题啦,嘻嘻。
但是,更加辛苦和耗时的是汇编代码的修改和编写、C/C++调用汇编函数过程遇到的种种问题,但是只要努力再加上有一定基础的情况下是搞得定许多问题的!
如果你感兴趣,或者就是和我一样碰到这样的问题,下面给出实例代码。
1.ASM文件
.data
;
数据段
.code
FUNC
proc
MOVEAX,1234
RET
endp
end
2.测试VS2005控制台工程
#include<
stdio.h>
extern"
int__stdcall
FUNC();
intmain(intargc,WCHAR*argv[])
{
intnret=FUNC();
printf(“%d\n”,nret);
system("
pause"
);
return0;
}
这其中的过程,还有很多需要解决的问题和思考的地方,这需要你的基本功了,就不在这里都说出来了,做一做就都知道了!
相信自己!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- x86 平台 x64 关于 内联 汇编 不再 支持 解决
![提示](https://static.bdocx.com/images/bang_tan.gif)