http://blog.csdn.net/lanzhengpeng2/article/details/2947262
最近在写64位汇编,设置编译命令是件繁琐而又重复的劳动。网上也有不少文章介绍怎么样编译64位汇编的,但都觉得复杂,有的还需要下载其他的汇编软件,最囧的是:有篇文章给出的下载地址下载下来的文件干脆就直接是木马!
既然我们使用VS系列,就不要舍近求远了。使用MS提供的ml64,安全放心,也无兼容性问题。下面开始说明怎么样设置:
一、在vc的安装目录下,找到“VCProjectDefaults/masm.rules”,复制出来,改个名字,用记事本等纯文本编辑器打开
二、masm.rules的前面几行的内容如下:
- <?xml version="1.0" encoding="utf-8"?>
- <VisualStudioToolFile
- Name="Microsoft Macro Assembler"
- Version="8.00"
- >
- <Rules>
- <CustomBuildRule
- Name="MASM"
- DisplayName="Microsoft Macro Assembler"
- CommandLine="ml.exe /c [AllOptions] [AdditionalOptions] /Ta[inputs]"
- Outputs="[$ObjectFileName]"
- FileExtensions="*.asm"
- ExecutionDescription="Assembling..."
- >
替换ml.exe为ml64.exe,然后把名称,扩展名修改成你喜欢的,下面是我的修改:
- <?xml version="1.0" encoding="utf-8"?>
- <VisualStudioToolFile
- Name="Macro Assembler x64"
- Version="8.00"
- >
- <Rules>
- <CustomBuildRule
- Name="MASM x64"
- DisplayName="Macro Assembler x64"
- CommandLine="ml64.exe /c [AllOptions] [AdditionalOptions] /Ta[inputs]"
- Outputs="[$ObjectFileName]"
- FileExtensions="*.asm64"
- ExecutionDescription="Assembling..."
- >
保存,关闭文件。
三、在解决方案资源管理器里,右键点中你的项目,出来一个菜单;选择“自定义生成规则...”,在弹出的对话框上,点“查找现有的...”,打开你刚才编辑的.rules文件。然后你就应该在“可用的规则文件”列表里看到你刚才修改的名字和扩展名(我的叫做asm64),在其左边的检查框里勾上,关闭这个窗口。
四、新建一个文本文件,改名成“文件名称.你喜欢的扩展名”,如我的就叫做“1.asm64”,然后把这个文件加入到工程里。不出意外,VS就自动根据扩展名选择了你刚才修改的规则;如果出了意外,则单独对“1.asm64”进行设置:在解决方案资源管理器里,右键点中这个文件,选择属性;然后在对话框里左边选择“配制属性/常规”,然后在工具里选择你刚才命名的规则。如我的叫做“Macro Assembler x64”。点“确认”按钮关闭这个对话框。
五、在“1.asm64”文件里写上正确的汇编,编译之。不出意外,64位汇编已经正确连接到你的程序里了。
六、打开“1.asm64”文件的属性对话框,应该能看到不少设置选项,慢慢琢磨吧。
show一段64位汇编代码:
- INCLUDE listing.inc
- pdata SEGMENT
- ___real_value_1 DD 03f800000r
- DD 03f800000r
- DD 03f800000r
- DD 03f800000r
- ___real_value_negation DD 080000000H
- DD 080000000H
- DD 080000000H
- DD 080000000H
- pdata ENDS
- ;void MulAdd(D3DMATRIX & Out,const D3DMATRIX & m1,FLOAT f,const D3DMATRIX & m2)
- ;{
- ; register FLOAT * pOut = (FLOAT *)&Out;
- ; register const FLOAT * pIn1 = (FLOAT *)&m1;
- ; register const FLOAT * pIn2 = (FLOAT *)&m2;
- ; for(register int i=15;i>=0;--i)
- ; pOut[i] = pIn1[i] * f + pIn2[i];
- ;}
- PUBLIC ?MulAdd@@YAXAEAU_D3DMATRIX@@AEBU1@M1@Z
- _TEXT SEGMENT
- ?MulAdd@@YAXAEAU_D3DMATRIX@@AEBU1@M1@Z PROC
- shufps xmm2,xmm2,0
-
- movups xmm0,[rdx]
- movups xmm1,[r9]
- mulps xmm0,xmm2
- addps xmm0,xmm1
- movups [rcx],xmm0
-
- movups xmm0,[rdx+16]
- movups xmm1,[r9+16]
- mulps xmm0,xmm2
- addps xmm0,xmm1
- movups [rcx+16],xmm0
- movups xmm0,[rdx+32]
- movups xmm1,[r9+32]
- mulps xmm0,xmm2
- addps xmm0,xmm1
- movups [rcx+32],xmm0
- movups xmm0,[rdx+48]
- movups xmm1,[r9+48]
- mulps xmm0,xmm2
- addps xmm0,xmm1
- movups [rcx+48],xmm0
-
- ret 0
-
- ?MulAdd@@YAXAEAU_D3DMATRIX@@AEBU1@M1@Z ENDP
- _TEXT ENDS
祝各位同仁_WIN64旅程愉快!