1. 程式人生 > >使用 Visual Studio 2017 寫純 64 位彙編(intel 風格)

使用 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