[HowTo]使用Visual C++ 2005 Express和MASM 8.0開發Win32程式
Visual Studio 2005內建了MASM 8.0,可與Visual C++ 2005搭配使用。或許是為了讓Visual C++ 2005 Express的使用者也有MASM可用,因此微軟也單獨釋出MASM8,但使用的前提是電腦必須先安裝了VC2005xprs,不然根本無法安裝。VC2005xprs可以作為MASM8的IDE,但若要以兩者搭配組語開發Win32程式,還有一些前置作業要進行。
如同以C語言搭配SDK開發Windows程式,除了需要編譯器、連結器,還需要引入檔和程式庫,這些檔案包含在Windows SDK裡;因此雖然有了MASM8能組譯、連結程式,但還缺少引入檔和程式庫。Windows SDK並沒有組語所需要的相關檔案,所幸已有人整理並釋出。此外,Visual C++ 2005可以作為MASM8的IDE,但還是要經過若干設定。
本文將說明使用MASM 8.0並以VC++ 2005 Express作為IDE開發Win32程式的前置作業。本文內容參考了Kip Irvine為其著作Assembly Language for Intel-Based Computers, 5th Edition所編寫的線上文章Getting started with MASM。此外,小木偶的網頁包含了內容豐富而完整的組合語言中文教學,其中亦包括了Win32組語的內容;您可以利用其中的範例程式來測試本文提及的步驟。
開始之前,必須依序先安裝VC++2005 Express(下載VC++2005 Express光碟ISO檔),再安裝MASM8(VS2005已內建MASM8,而本文亦適用以VC++2005和MASM8開發Win32程式,惟VC++2005若干設定的位置會與Visual C++ 2005 Express不同)。
接著要安裝MASM32,因為我們需要一份組語專用的Windows SDK,例如MASM32就是相當多人使用且免費的資源。目前最新版本是9.0的MASM32除了包含了以組語開發Windows程式所需要的引入檔、程式庫,甚至也包含了MASM 6.14.8444和一個GUI文字編輯器,您可以編輯程式,並在命令提示字元的文字模式組譯程式。
Hello MASM
VC++2005 Express不會因為安裝了MASM8而多了MASM專案類型,但是『一般』專案類型的『空專案』可用於MASM。同樣的,『程式碼』分類的『C++檔』範本,亦可作為專案理的組語原始檔。整個過程請參考以下的示範。
1.新增名為Hello-MASM-1的專案:專案類型選擇『一般』,範本請選擇『空專案』。
2.加入MASM自訂建置規則:先以滑鼠選取『方案總管』視窗裡的專案名稱本例為Hello-MASM-1),再執行VC++ 2005 Express的『專案/自訂建置規則』,交談窗裡應該會有Microsoft Macro Assembler,請勾選這項並按『確定』鈕。
3.以滑鼠右按下『方案總管』裡的『原始程式檔』,並以快顯功能表的『加入/新增項目』將組語原始檔加入專案:分類選擇『程式碼』,範本選擇C++檔,存檔時請務必輸入.asm作為副檔名(此例的原始檔名為main.asm)。利用『專案/加入新項目』也可以將組語原始檔加入專案。
4.在編輯器輸入組語程式碼,例如可以使用『小木偶的網頁/Win32 的組合語言/01.第一個程式』裡的範例(此例會在螢幕顯示交談窗,該網頁亦有詳盡的解說可供參考)。
5.指定Include及Lib目錄:執行『工具/選項』,再選取交談窗左側的『專案和方案/VC++目錄』,然後將MASM的Include、Lib目錄加到『Include 檔案』、『程式庫檔』。
6.定義子系統:以滑鼠右鈕按下『方案總管』裡的專案名稱(本例為Hello-MASM-1),並選屬性,選取交談窗左側的『組態屬性/連結器/系統』,將交談窗右側的『子系統』設定值改成『主控台』。
7.執行『建置/建置方案』。
8.如果沒有錯誤,便可利用DOS視窗執行上述所建置的程式(以下是執行結果)。
上述的第5步驟只需執行一次,但其他步驟每次都需執行。小木偶的網頁的組合語言有豐富的內容可供作學習參考;例如您可試著仿效以上步驟來建置『標準視窗』單元裡的組語程式。此外,Getting started with MASM還有許多相關的設定說明,也是這個議題的重要參考資料。
[註]紅字是後續補充、修正。
延伸閱讀:MASM 8.0 x86版可以免費下載


38 意見:
6.定義子系統:以滑鼠右鈕按下『方案總管』裡的專案並選屬性,選取交談窗左側的『組態屬性/連結器/系統』,將交談窗右側的『子系統』設定值改成『主控台』。
這裡不一定要設成主控台,因為產生的是視窗程式,應該是設定成windows
的確不一定要設定成主控台,以步驟4所提範例為例,『主控台』或『Windows』皆可產生正確的結果。
步驟4所提範例只是叫用了系統的交談窗,主控程式也能做到;例如『命令提示字元』就以各種交談窗讓使用者修改『命令提示字元』執行環境的設定。
賴大哥,最近因為工作需要買了您的Windows System Programming 3/e來看,這詞發現到您的網誌上有很多好東西,謝謝您的那本書幫我解決不少問題,不過關於取得MASM 8.0免裝VS 2005,我也有個做法想分享,希望和我一樣來這邊的讀者能方便一些。
http://www.wretch.cc/blog/takira&article_id=9504248
erinus您好:
謝謝您的分享,您的這篇文章很好,我會貼文介紹您的文章。
您的部落格內容相當精彩,有奇幻武俠小說的連載,還有 X-Japan 的連結;年輕時偏執於重金屬音樂,X-Japan 是活躍於當時的大團,直到現在我仍時常聆聽他們的作品。
用 WINRAR 把 MASM8.0 的安裝檔解壓縮,最後 .CAB 裡面的檔名,直接更名成 ML.EXE 就可以了,不用使用 EXPAND.EXE。
不過直接用 ML.EXE 8.0 在 CMD 下編譯,會出現
C:\masm32\INCLUDE\windows.inc(17530) : error A2138: invalid data initializer
錯誤。
但是在 VC2005 上就沒這問題。
感謝您分享心得。
請問在官網的 資料庫Irvine 要如何引用呢?
我看範例時是使用
INCLUDE Irvine32.inc
即可
但我自己寫時
用INCLUDE Irvine32.inc 卻不能成功
反而出現
fatal error A1000: cannot open file : Irvine32.inc
的錯誤
請問我是哪邊出了問題導致無法使用Libery呢?
錯誤訊息已經提到「無法開啟Irvine32.inc」,因此建議您檢查檔案的位置對不對?或者您要include的Irvine32.inc有沒有壞?
賴大哥你好:
我在建置方案時遇到了下列的錯誤:
.\masm.asm(7) : fatal error A1000: cannot open file : kernel32.lib
我試了好多次,都是同樣的結果。我有去確認過我的檔案還在,而且路徑也對,要怎樣才能知道造成此結果的原因。要是如您所說,檔案遭到毀損,那麼我要如何去驗證得知檔案是否有遭到毀損?以及如何修復或處理遭毀損的檔案?
偉誠您好:
請問您有依照本文步驟5,將include、inc、lib等檔案的正確目錄加入Visual C++ Express或Visual Studio嗎?不然的話,IDE會找不到相關檔案。
include、inc、lib等檔案必須另外下載,而且有很多版本可用,像本文用的是MASM32,本文提及的『小木偶的網頁』介紹了MASM和TASM。如果懷疑檔案已損毀,可以重新下載,並覆蓋疑似損毀的檔案。
賴大哥你好:
我有確實做到步驟5,將include及lib正確目錄加入Visual C++ Express,但是無論試了多少次,還是出現同樣的錯誤。
我是安裝MASM32 v9.0後,才有c:\masm32\lib..等這些東西的,要如何才能知道所需要的檔案是需要另外下載的?以及去何處下載?!
偉城您好:
您已安裝MASM 32就是我所謂的「需要另外下載」的檔案。聽您的描述,您的作法似乎都正確,但結果卻出乎意料是失敗的。我建議做一些交叉測試,如下:
移除再重新安裝MASM 32(甚至重新下載MASM 32),然後再試試。
或者嘗試利用「命令提示字元」環境來編譯連結,看看會不會出現kernel32.lib無法開啟的錯誤。您可以參考「小木偶網頁」的「Win32組合語言」,其中的第0、1章提及了相關作法。
賴大哥您好:
我照上述步驟
可是去出現以下錯誤訊息耶請問我該怎麼做
1>.\test.asm(4) : fatal error A1000: cannot open file : windows.inc
1>Project : error PRJ0019: 工具傳回錯誤碼"Assembling..."
littleflyer 您好:
您遇到的錯誤訊息代表著IDE找不到windows.inc。您應該檢查IDE的include路徑設定是否正確、windows.inc是否在指定的include路徑、甚至windows.inc檔案是否損毀(windows.inc是純文字檔,可以文字編輯器開啟)。
賴大哥您好:
我照上述步驟
結果我的MASM9 沒辦法安裝耶
一安裝就出錯
還有 安裝MASM9 後就可以讀
include windows inc了嗎?
請指教 謝謝 <(_ _)>
您好:
您提及的MASM9,應該是指www.masm32.com提供的MASM 32 v9吧?!但您只提及安裝MASM32 v9會出錯,但未說明任何進一步相關資訊,對此我也難以提供進一步的建議。
此外,我也不是很瞭解您「安裝MASM9 後就可以讀include windows inc了嗎?」的意思,但MASM32 v9的確提供了windows.inc,並且預設會將此檔(以及所有的include檔)安裝在c:\masm32\include資料夾。
希望以上回覆對您有所助益,謝謝。
在 "方案" 的 "屬性頁" 中,"組態屬性" 之下 只有 "組態" 一項,並無其他 (如 "連結器" 等),請問是否設定上有任何錯誤或遺漏? 請指正!
謝謝!
您好:
感謝您的留言。關於您的問題,我覺得可能是您誤會我第6點的文字意思了,如果您以滑鼠右鈕按下的是『方案總管』裡的「方案」,的確如您所述的在『組態屬性』之下只有『組態』一項。
但我在第6點的意思是要以滑鼠右鈕按下『方案總管』裡的「專案名稱」,以本文所舉的例子是要按下『Hello-MASM-1』。
感謝您的留言,讓我知道自己的描述仍有待加強,我也調整文中這個部分的文字,希望不致再讓其他讀者誤會。
賴大哥您好~~
work.obj : fatal error LNK1190: invalid fixup found, type 0x0001
這是我照著您的文章做了之後所出現的錯誤...看不太懂的說...好像是linker error之類的??
您的做法我都有做到,也都沒有出現什麼錯誤~~~
To Cookies:
就我所知這個訊息應該是連結了16位元OBJ所致。
建議您檢查該部電腦裡是不是還有其他版本的組語編譯器或連結器,或者以您的錯誤訊息(fatal error LNK1190: invalid fixup found, type 0x0001)搜尋Google。
謝謝。
賴老師您好
我的論壇轉載了您的文章, 因為真的寫得太詳盡了~
http://hitgoing.com/bbs/viewthread.php?tid=2519&extra=page%3D1&frombbs=1
小弟剛開始研究組合語言, 是靠您這篇文章作為啟蒙, 謝謝您, 我會買你的書
if02您好:
很高興拙著對您有所助益。謝謝您。
請問賴大哥,MASM615是否也適用於上述步驟?
阿杰您好:
MASM 6.15可以組譯如文中的Win32程式,但能不能搭配文中所述的Visual C++ 2005 Express,我也沒試過,建議您親自試試。
請問賴大哥
我要執行的時候 跑出一個此組態已過期的警告視窗耶
然後下面附帶一個表
xxx-debug win32
我這樣要怎麼解決阿
感謝...
很抱歉,我不瞭解您所述之情況,因而無法回答。
抱歉,想問一下
MASM : fatal error A1000: cannot open file : Project : error PRJ0019: 工具傳回錯誤碼"Assembling..."
這是說不能打開project
是說我project也要include進去嗎
那麼要怎麼做呢?
謝謝~~~
您好:
因為您的問題促成我寫了一篇短文來說明(因為A1000很多人問),請參閱《Fatal Error A1000: Cannot Open File與Project Build Error PRJ0019》。
給有相同問題的人:
1>.\test.asm(4) : fatal error A1000: cannot open file : windows.inc
1>Project : error PRJ0019: 工具傳回錯誤碼"Assembling..."
在賴大哥所提到的第5步驟,將C:\masm32\lib 改成 C:\masm32\include即可解決問題!
請問是賴先生嗎?
我讀過你的文章後,我完全看不懂圖片中的程式碼,為什麼!?
我又不是不懂寫程式,(雖然我只學會幾個簡單的語法)但為什麼我學的C語言跟你的不相同?
如果要具體點講就不得不寫一套例子的程式出來:(我以加法為例)
#include
#include
int main(void)
{
float x,y;
printf("請輸入加數\n");
scanf("%f",&x);
printf("請輸入被加數\n");
scanf("%f",&y);
printf("答案是%f",x + y");
system("pause");
return 0;
}
例子程式我寫完了,怎樣?跟你學習的程式很大分別吧?
你可以把我的程式碼寫同這套程式上來,但不要複製,當你打{和}時會自動隔一格(我和你都是用同一種軟件:VC++2005EXPRESS,而且一樣是WIN32應用程式。)
為什麼會出現我學習的程式碼?(又不是不能寫出一套程式)而且我如何用自己這類的程式碼做到你的效果?
啊!
BLOGGER竟把我寫的程式碼的空格全都刪除了!
我無法提供正確的程式碼了,如果你想知正確的請E-mail我:lcm852@yahoo.com.hk
lcm852 您好:
很感謝您留言。但在下才疏學淺,無法理解您的問題,因此無法回答,很抱歉。
給 lcm852:
你自己也寫的很清楚了
你使用的是C語言(雖然你給的範例是cpp)
如果你有看清楚的話
賴先生的文章寫的是"組合語言"(asm)
雖然你是學生,但是問問題的時候
口氣不要太粗魯,這只會讓別人覺得
你才疏學淺。
您好,我在建置環境上遇到一些問題,想請教您。
這個是我的測試程式
INCLUDE Irvine32.inc
.code
main PROC
mov eax,10000h
call DumpRegs
exit
main ENDP
END main
建置訊息----------
正在連結...
1>H1_109616043.obj : error LNK2019: 無法解析的外部符號 _DumpRegs@0 在函式 _main@0 中被參考
1>C:\Documents and Settings\Planta\My Documents\Visual Studio 2005\Projects\H1\Debug\H1.exe : fatal error LNK1120: 1 個無法解析的外部符號
---------------------------
步驟四的小木偶程式是可以執行的,但我自己的這個程式就無法建置!
我有在第五步確實將irvine32.inc的所在目錄加入『Include 檔案』中,但看起來還是無法辨識irvine32.inc中的dumpreg函式,百思不得其解,只好來麻煩您,感謝。
聽您描述似乎都正確,卻還是出錯,問題應該出自這個外部函式,我只能建議鎖定它仔細檢查(但您的描述提及DumpRegs和dumpreg,是哪裡筆誤?)
是DumpRegs沒有錯,抱歉,您說的鎖定函式找問題我不太懂意思,我遇到的問題是我沒有辦法去include我要的檔案,因為不只是DumpRegs這個Irvine32.inc裡的函式沒辦法被參照,DumpMem也是無法參照,應該是完全沒辦法參照到Irvine32.inc這個檔案,但實在不知道為何,我現在已經試過2005 2008 2010三種版本,都沒辦法include進去,頭昏腦脹,感謝您的回覆,我再努力找找問題在哪。
Tarcyfans您好:
抱歉,讓你誤會我的意思了。
我的意思是錯誤的原因應該與DumpRegs有關,因為您提供的訊息指出無法解析DumpRegs。
但在找錯誤原因的初期時,不只要看某個點,還應該將範圍擴大。回到您的問題,DumpRegs無法解析應該不會是DumpRegs本身的問題(原作者寫的函式應該沒有錯),而是您程式連結該函式的時候出錯了。
您的回覆再次提醒我DumpRegs是函式。因此連結時也必須讓linker知道該函式的lib檔的位置,否則可能就會出現這類無法解析的錯誤。
也就是說,您似乎只加入DumpRegs函式的引入檔路徑,卻沒有加入DumpRegs函式的程式庫檔案路徑。
希望以上有助您解決問題。
好的,感謝您,謝謝。
張貼意見