vs 2019编写汇编并运行调试
前言
我是上學期學的匯編,因為有vs又不想用課上教的麻煩的dosbox以及masm32,但是一直沒找到高亮插件和能調試的(難在運行不了而找不到答案上,出現的錯誤在最后放出,還請先達們不吝指點)匯編代碼所以放棄了。
但是我又偶然想起來了,而且偶然找到了高亮插件!
(那時查了很多帖子,甚至有人說在某度知道里說vs不能寫匯編,我真是對這種不負責任的回答嗤之以鼻,
有個貼吧的帖子說
匯編開發環境,個人建議,如果已經安裝了Visual Studio,推薦直接用vs作為開發調試工具,原因很簡單,現在用的規則就是masm,微軟的規則,沒有人比微軟更了解微軟,而且可以很方便的為后續加入c/c++開發提供一站式的平臺,如果沒有安裝,可以考慮后者Radasm+ Masm32,不要用什么cmd,然后debug。。。愚蠢至極,除了裝逼浪費時間,還是裝逼浪費時間,并沒有半點實際價值。詳見http://tieba.baidu.com/p/4827889049
嗯,我很同意上面不是斜體的那段文字(尤其是win10后根本沒debug了,還得搞dosbox),所以我又來找vs運行匯編的方法了~
)
沒想到課本上那么少的東西實際運行起來水那么深,深的不是基本語法,而是各種庫什么的照搬書上的代碼都沒法運行,真是……根本不像之前的c語言直接一個f5就完事那么簡單。(ps:參考的那幾個帖子的代碼有的能運行,有的)
?
==============分割線============
~最簡單的(C中內嵌匯編代碼):在VS的C++文件里直接使用__asm{} 直接寫匯編代碼.
http://blog.csdn.net/sinat_27382047/article/details/53968622
?
~偷個懶寫匯編作業(C語言生成匯編代碼)或者研究一下生成的匯編代碼
http://blog.csdn.net/sinat_27382047/article/details/72810726
?
~反匯編介紹(直接查看c中某些代碼的匯編代碼):
http://blog.csdn.net/sinat_27382047/article/details/72810788
?
~匯編代碼在vs上的使用方法(配置完的VS并不能正常運行平時能在dosbox上運行的匯編語句):
http://blog.csdn.net/sinat_27382047/article/details/72830040
↑↑↑↑↑↑(你們想要的純匯編hello world)↑↑↑↑↑
?
==============分割線============
?
?
正片兒:
插件
?
vs2015的匯編語法高亮插件(安裝就行)這玩意找了我很久= =
http://download.csdn.net/detail/fhw_bin_dl/9724391
**其實AsmHighlighter高亮插件非常好弄的,在VS2017 工具->擴展和更新->選擇聯機->搜索AsmHighlighter,然后安裝就行了【感謝下方評論中的OringeEd君】
?
過程【這是小事,vs這一系列都可以照葫蘆】
?
一、建項目
1.建一個空項目,必須先建空項目,改現成的C++項目為assembler項目可能會造成編譯不過.
?
2.選中項目右鍵 “生成自定義”,選擇MASM生成規則.
?
?
二、添加及設定源文件
3.選中源文件右鍵-》添加-》新建項
此處后綴名是匯編的.asm
4.選中項目右鍵-》屬性-》鏈接器-》系統-》 子系統選 “控制臺(SUBSYSTEM:CONSOLE)”
5.選中項目右鍵-》屬性-》鏈接器-》高級-》 入口點 填 "main"
?
三、測試代碼編譯運行:
(可以看到,如果安裝了高亮插件,不僅注釋可以用了,代碼也有高亮提示了)
最后,輸出,調試時選擇菜單 調試-》窗口-》寄存器 就能看到寄存器值。(這樣,就不至于苦逼地用指令-ip一步步看了吧~)
?
?
代碼【這事兒可深了……】
先上那位大神可以過的代碼
?
TITLE Add and Subtract ? ? ? ? ? ? ?(AddSub.asm)
?
; This program adds and subtracts 32-bit integers.
; Last update: 2/1/02
?
?
INCLUDELIB kernel32.lib
?
.MODEL flat,stdcall
?
;.code
ExitProcess PROTO, ? ? ? ? ? ? ?; exit program
dwExitCode:DWORD?? ??? ?; return code
?
?
.data
.code
main PROC
?
?? ?mov eax,10000h?? ??? ?; EAX = 10000h
?? ?add eax,40000h?? ??? ?; EAX = 50000h
?? ?sub eax,20000h?? ??? ?; EAX = 30000h
?
?? ?push 0h
?? ?call ExitProcess
?
main ENDP
END main
關于代碼的討論:https://blog.csdn.net/Alisebeast/article/details/79861177
?
???
?
感謝以下找過的對我有用的帖子:
——來自貼吧的嘲諷~
http://tieba.baidu.com/p/4827889049
——高亮插件(asmhighlighter官網?)
http://asmhighlighter.codeplex.com/
——求高亮插件的帖子
?http://bbs.csdn.net/topics/391043876
——[匯編]_[初級]_[VS2010搭建匯編開發環境win32和x64](過程部分基本如此帖所做)
http://blog.csdn.net/infoworld/article/details/45085415
——vs2010的插件英文教程
http://kipirvine.com/asm/4th/index.html【《Intel匯編語言程序設計(第4版)》作者網址】
http://kipirvine.com/asm/gettingStartedVS2015/index.htm#tutorial32(貌似這就是所有參考的源頭,很全)
http://kipirvine.com/asm/gettingstartedvs2010/#syntax (大佬jie匯介紹高亮插件)
(↑以上都是這位大佬寫的!)
http://www.deconflations.com/2011/masm-assembly-in-visual-studio-2010/
?
?
=========分割線====2018.2.10============
VS2017寫匯編教程(親測可用,很順暢,做到了上文中“直接一個f5就完事”,沒有ml.exe的錯誤):
http://blog.csdn.net/maguanzhan7939/article/details/78608345
【這樣 就不用masm for windows那樣的收費ide了~還比那個逼格高】
?
——一些源網:
http://www.masm32.com/download.htm?(masm32)
https://archive.codeplex.com/?p=asmhighlighter ?(asmhighlighter)
?
===========以下為廣告,想省事的可以來我這里2C幣下載~===================
不想裝masm32(上圖那貨)只想要庫的可以下我放的鏈接(內含一套 高亮插件+要用到的masm庫):
http://download.csdn.net/download/sinat_27382047/10248253
?
————————————————
原文鏈接:https://blog.csdn.net/sinat_27382047/article/details/70339455
?
----------------------------------------------------------------------------------------------------------------------------------------------
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
————————————————
原文鏈接:https://blog.csdn.net/Alisebeast/article/details/79875620
總結
以上是生活随笔為你收集整理的vs 2019编写汇编并运行调试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 输卵管堵塞怎么治比较好
- 下一篇: 如何禁用win7的ASLR