使用 Visual Studio 2017 寫純 64 位彙編(intel 風格)
1. 新建個 Visual C++ 的空專案
關閉 [安全開發生命週期(SDL)檢查],並選擇空專案
2.生成依賴性
選擇 masm 依賴項並生成
(注意:若先建立了 asm 檔案再生成依賴項,asm 檔案是不會被彙編軟體編譯的!解決方案在最後!)
3.新建 asm 彙編檔案
4.編寫組合語言
.code ;程式碼段 !64 位沒有 .model 巨集指令,無法設定記憶體模型和生成的程式碼風格! main proc ;main函式開始 mov rax, 120 add rax, 34 sub rax, 130 ret main endp ;main函式結束 end ;masm x64 沒有指定入口點的巨集指令!
關於 masm x64 沒有指定入口點的巨集指令 的問題,會在最後的參考部落格中給出連結(國外論壇和微軟官方的解答)
5.將偵錯程式位數換成 x64
6.選擇 專案->屬性 [配置屬性->聯結器->高階[入口點 輸入您想入口的函式名]]
4 步驟中的彙編程式碼,我用 main 當作入口函式,所以這裡填入的是 main
若想讓入口點為 a 函式,即下面貼的彙編程式碼,則在入口點處填個 a (表示 a 函式是程式的入口點)
.code ;程式碼段 !64 位無法使用 .model 巨集指定記憶體模型和生成的程式碼風格! a proc ;a函式開始 mov rax, 120 add rax, 34 sub rax, 130 ret a endp ;a函式結束 end
7.在第一條語句打下斷點,然後執行程式
8.在 除錯->視窗->開啟暫存器、記憶體、反彙編 之類的資訊視窗(根據需要選擇)
若沒有這些選項,說明您沒有(除錯)執行程式 參照第七條
9.選擇藍圈中不同的執行方式,來除錯您的彙編程式
提示:在上圖左下 [暫存器] 顯示框中,可右鍵選擇您想顯示的暫存器
結束
可能遇到問題的解決方案:(遇到其他問題,請留言,我會找解決方法)
一. asm 檔案沒有被編譯
原因:若先建立了 asm 檔案再生成依賴項,已建立的 asm 檔案是不會被彙編軟體編譯的,已建立的 asm 檔案的屬性是不能被編譯的屬性
①開啟 .asm 檔案的的屬性
②在常規中更改 項選項 位 Microsoft Macro Assembler
二. error LNK2005: main 已經在 a.obj 中定義
( main 是您定義的入口點函式,若是定義的入口點是函式 a,則異常是 error LNK2005: main 已經在 *.obj 中定義)
原因:在一個專案裡定義了多個 asm 檔案,並具有相同的入口函式
解決方案1:用專案分割不同的 asm 檔案
解決方案2:不同的 asm 檔案定義不同的函式入口點,執行相應彙編程式時,照著步驟六修改專案的程式入口點為相應檔案的入口函式
三. 為什麼我使用中斷會觸發異常
原因:Windows10 上的程式是執行在 CPU 保護模式下的,在此模式下只能觸發系統定義的軟中斷,無法觸發硬中斷,若想觸發硬中斷,請使用 DosBox 模擬 CPU 真實模式
推薦書籍:
《現代x86組合語言程式設計》
《組合語言:基於x86處理器》
參考博文:
Visual Studio 2017 asm 高亮外掛:
https://blog.csdn.net/sinat_27382047/article/details/70339455#comments
http://blog.csdn.net/maguanzhan7939/article/details/78608345
masm 巨集定義規則:
https://msdn.microsoft.com/en-us/library/wxy1fb5k.aspx
關於 masm x64 沒有指定入口點的巨集指令 的問題:
https://docs.microsoft.com/zh-cn/cpp/assembler/masm/masm-for-x64-ml64-exe
https://social.msdn.microsoft.com/Forums/vstudio/en-US/2107f634-1152-4a85-ae48-0d580aaf3f02/why-does-64bit-masm-not-accept-an-entry-point-address-on-the-end-directive?forum=vcgeneral
推薦閱讀:
使用 Visual Studio 2017 寫純 32 位彙編(intel 風格)
https://blog.csdn.net/alisebeast/article/details/79875393