C++ Coder

HCP高性能计算架构,实现,编译器指令优化,算法优化, LLVM CLANG OpenCL CUDA OpenACC C++AMP OpenMP MPI

C++博客 首页 新随笔 联系 聚合 管理
  98 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks
http://blog.csdn.net/lanzhengpeng2/article/details/2947262

最近在写64位汇编,设置编译命令是件繁琐而又重复的劳动。网上也有不少文章介绍怎么样编译64位汇编的,但都觉得复杂,有的还需要下载其他的汇编软件,最囧的是:有篇文章给出的下载地址下载下来的文件干脆就直接是木马!

既然我们使用VS系列,就不要舍近求远了。使用MS提供的ml64,安全放心,也无兼容性问题。下面开始说明怎么样设置:

一、在vc的安装目录下,找到“VCProjectDefaults/masm.rules”,复制出来,改个名字,用记事本等纯文本编辑器打开

二、masm.rules的前面几行的内容如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <VisualStudioToolFile
  3.     Name="Microsoft Macro Assembler"
  4.     Version="8.00"
  5.     >
  6.     <Rules>
  7.         <CustomBuildRule
  8.             Name="MASM"
  9.             DisplayName="Microsoft Macro Assembler"
  10.             CommandLine="ml.exe /c [AllOptions] [AdditionalOptions] /Ta[inputs]"
  11.             Outputs="[$ObjectFileName]"
  12.             FileExtensions="*.asm"
  13.             ExecutionDescription="Assembling..."
  14.             >

替换ml.exe为ml64.exe,然后把名称,扩展名修改成你喜欢的,下面是我的修改:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <VisualStudioToolFile
  3.     Name="Macro Assembler x64"
  4.     Version="8.00"
  5.     >
  6.     <Rules>
  7.         <CustomBuildRule
  8.             Name="MASM x64"
  9.             DisplayName="Macro Assembler x64"
  10.             CommandLine="ml64.exe /c [AllOptions] [AdditionalOptions] /Ta[inputs]"
  11.             Outputs="[$ObjectFileName]"
  12.             FileExtensions="*.asm64"
  13.             ExecutionDescription="Assembling..."
  14.             >

保存,关闭文件。

三、在解决方案资源管理器里,右键点中你的项目,出来一个菜单;选择“自定义生成规则...”,在弹出的对话框上,点“查找现有的...”,打开你刚才编辑的.rules文件。然后你就应该在“可用的规则文件”列表里看到你刚才修改的名字和扩展名(我的叫做asm64),在其左边的检查框里勾上,关闭这个窗口。

四、新建一个文本文件,改名成“文件名称.你喜欢的扩展名”,如我的就叫做“1.asm64”,然后把这个文件加入到工程里。不出意外,VS就自动根据扩展名选择了你刚才修改的规则;如果出了意外,则单独对“1.asm64”进行设置:在解决方案资源管理器里,右键点中这个文件,选择属性;然后在对话框里左边选择“配制属性/常规”,然后在工具里选择你刚才命名的规则。如我的叫做“Macro Assembler x64”。点“确认”按钮关闭这个对话框。

五、在“1.asm64”文件里写上正确的汇编,编译之。不出意外,64位汇编已经正确连接到你的程序里了。

六、打开“1.asm64”文件的属性对话框,应该能看到不少设置选项,慢慢琢磨吧。

 

show一段64位汇编代码:

 

  1. INCLUDE listing.inc
  2. pdata   SEGMENT
  3. ___real_value_1 DD 03f800000r
  4.     DD  03f800000r
  5.     DD  03f800000r
  6.     DD  03f800000r
  7. ___real_value_negation DD 080000000H
  8.     DD  080000000H
  9.     DD  080000000H
  10.     DD  080000000H
  11. pdata   ENDS
  12. ;void MulAdd(D3DMATRIX & Out,const D3DMATRIX & m1,FLOAT f,const D3DMATRIX & m2)
  13. ;{
  14. ;   register FLOAT * pOut = (FLOAT *)&Out;
  15. ;   register const FLOAT * pIn1 = (FLOAT *)&m1;
  16. ;   register const FLOAT * pIn2 = (FLOAT *)&m2;
  17. ;   for(register int i=15;i>=0;--i)
  18. ;       pOut[i] = pIn1[i] * f + pIn2[i];
  19. ;}
  20. PUBLIC ?MulAdd@@YAXAEAU_D3DMATRIX@@AEBU1@M1@Z
  21. _TEXT   SEGMENT
  22. ?MulAdd@@YAXAEAU_D3DMATRIX@@AEBU1@M1@Z  PROC
  23.     shufps xmm2,xmm2,0
  24.     
  25.     movups xmm0,[rdx]
  26.     movups xmm1,[r9]
  27.     mulps xmm0,xmm2
  28.     addps xmm0,xmm1
  29.     movups [rcx],xmm0
  30.     
  31.     movups xmm0,[rdx+16]
  32.     movups xmm1,[r9+16]
  33.     mulps xmm0,xmm2
  34.     addps xmm0,xmm1
  35.     movups [rcx+16],xmm0
  36.     movups xmm0,[rdx+32]
  37.     movups xmm1,[r9+32]
  38.     mulps xmm0,xmm2
  39.     addps xmm0,xmm1
  40.     movups [rcx+32],xmm0
  41.     movups xmm0,[rdx+48]
  42.     movups xmm1,[r9+48]
  43.     mulps xmm0,xmm2
  44.     addps xmm0,xmm1
  45.     movups [rcx+48],xmm0
  46.     
  47.     ret 0
  48.     
  49. ?MulAdd@@YAXAEAU_D3DMATRIX@@AEBU1@M1@Z  ENDP
  50. _TEXT   ENDS

祝各位同仁_WIN64旅程愉快!

posted on 2012-10-30 11:13 jackdong 阅读(726) 评论(0)  编辑 收藏 引用 所属分类: IDE

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理