最近在寫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旅程愉快!