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旅程愉快!