引子
由於這些日子一直都在研究底層的技術,從 Windows 驅動程式,到 Windows 核心等等技術的學習,
讓我對底層的技術越發有興趣了,而剛好,在研究 WRK 時,
對記憶體管理,寄存器,地址匯流排,資料匯流排,控制匯流排等的理解不夠透徹,
所以越發的想學習組譯工具設計來提升功力,
而由於近來在公司裡一直都有項目壓著,所以在公司裡也實在不好拿本組譯工具設計看,
所以只好晚上回來學習了, 彙編看了幾個晚上,也算是蠻有感覺的。
今天就先來搭個開發環境再說吧。
開發環境搭配
我介紹四種開發組譯工具的方式:
第一種:直接在 Dos 環境下使用 Edit 命令調出源碼編輯框,
產生源碼後,可以使用由微軟提供的 masm 彙編編譯器來對源碼進行編譯,
編譯完後再使用 Linker 連接器即可得到可執行檔,
這種方式現在幾乎被滅絕了(當然使用 masm 彙編編譯器還是很普遍的),
除非你真要在 DOS 環境下運行組譯工具;
第二種:通過簡化第一種方式而來;
第三種:直接使用 Masm for Windows 整合實驗環境,這個開發環境呢,非常適合組合語言的初學者,
因為這個 IDE 本身就是由一些從事組譯工具教學的大學老師開發的出來用於彙編初學者進行學習和實驗的,
所以使用簡單,方便,這裡可以對這個 IDE 稍加推薦;
第四種:則是通過 Visual Studio 這個強大的 IDE 來實現組譯工具的編譯,運行和調試,
至於 Visual Studio 就不多做介紹了,.Net 用了這麼多年,這東西強大到什麼程度那是總所周知的;
第一種方式:使用 Edit + MASM 5.0 編譯器 + Linker 連接器
其實這種方式是很簡單的,只是很麻煩,因為簡單而且麻煩,
所以我採用儘可能的將傳上來,然後稍加註解的方式進行介紹,
軟體準備:
需要 MASM 5.0 或者以上的彙編編譯器
首先,是要編輯彙編原始碼:
其實對於源碼的編輯根本不需要向如下這麼麻煩,直接拿個記事本就 OK 了
運行 cmd 命令
輸入 Edit 命令從而彈出彙編源碼編輯框
在源碼輸入框中輸入彙編源碼
將編輯好的彙編源碼儲存到 xx.asm 檔案中
然後就是要編譯編輯好的彙編原始碼
在 Dos 環境下進入到 MASM 5.0 彙編編譯器所在的目錄
然後運行 masm.exe
可以從上面的中看到 [. ASM] 的標記,這個標記代表的是需要在這裡輸入要編譯的來源程式檔案名稱,
這裡有一點特別的是,由於預設的副檔名為 .asm ,所以在編譯 .asm 的彙編來源程式時可以不用指定來源程式所在檔案的副檔名。
我們將一開始編輯好的彙編來源程式所在的檔案輸入以進行編譯
指定檔案所在路徑後按 Enter 鍵
此時可以看到編譯器提示需要輸入要編譯出的目標檔案的名稱,由於在一開始已經指定了 BoyXiao. asm ,
所以編譯器自動指定了目標檔案的名稱為 BoyXiao. obj 的名稱,如果在這裡不做修改的話,
則編譯器會以預設目標檔案名稱 BoyXiao. obj 進行輸出,在這裡我並不改變名稱,所以直接按 Enter 鍵即可
此時又提示需要輸入列表檔案的名稱,其實是完全可以不要讓編譯器產生這個 LST 檔案的,所以也不需要進行輸入,
直接按 Enter 鍵即可
此時又提示需要輸入交叉引用檔案的名稱,這裡也完全可以不要讓編譯器產生這個 CRF 檔案,
所以也不需要進行輸入,直接按 Enter 鍵即可
至此,彙編來源程式編譯成功,
編譯得到的結果就是在我的 E:\Tools\MASM\MASM 5.0 目錄下產生了一個 BoyXiao.obj 檔案
下面就是要實現對目標檔案的串連
經過編譯操作後,我們得到了一個 .obj 的目標檔案,但很顯然,這還並不是一個可執行檔,
下面就需要對目標檔案進行串連,從而得到一個可執行檔。
一般來說,需要準備一個連接器,這裡我使用的是微軟提供的 Linker 連接器,即 LINK.EXE ,
進入 LINK.EXE 檔案所在目錄,直接運行 LINK.EXE
此時提示需要輸入被串連的目標檔案的名稱,這裡也就是 BoyXiao.obj ,
由於我的 BoyXiao.obj 和 Link.exe 在同一目錄下,所以不需要指定路徑,直接給出 .obj 的名稱即可,
按 Enter 鍵
這裡提示需要輸入要產生的可執行檔的名稱,此時如果想要將可執行檔輸入到指定目錄下,
則需要指定目錄,否則只需要指定名稱即可,並且可以看到名稱已有預設值:BOYXIAO.EXE
在這裡我選擇預設值,所以直接按 Enter 鍵即可
按 Enter 鍵
又繼續提示需要輸入映像檔案的名稱,在這裡,不需要產生這個檔案,所以直接按 Enter 鍵即可
此時又提示需要輸入庫檔案的名稱,由於我們的這個程式中沒有使用任何的子程式,
也就是根本沒有調用什麼庫檔案,所以這裡也可以直接按 Enter 鍵處理
至此,整個目標檔案的串連工作結束,得到的結果是一個 EXE 檔案
執行組譯工具
其實執行起來是看不到什麼結果的,因為上面的彙編代碼沒有輸出任何內容,而只是改變了幾個寄存器的值而已,
自然也就看不到任何的輸出了。
第二種方式:使用 Edit + MASM 5.0 編譯器 + Linker 連接器 (簡化版)
這種方式其實和第一種方式說不上有什麼區別,只不過在編譯和串連過程中使用了很多編譯器和連接器的預設設定而已
軟體準備:
和第一種方式一樣
編輯彙編原始碼:
和第一種方式一樣,也可以是直接使用文字編輯器編輯即可
編譯編輯好的彙編原始碼
直接到 MASM.EXE 檔案目錄,然後直接使用 masm 編譯指定路徑的檔案即可
特別注意的是,需要在目錄的後面加上 “;”
同樣在 E:\Tools\MASM\MASM 5.0 目錄下產生了 BoyXiao.obj 目標檔案
實現目標檔案的串連
同樣,直接下到連接器 LINK.EXE 檔案所在的目錄,然後直接使用 LINK 串連指定的目標檔案即可
同樣需要注意在目錄或檔案名稱的後面加上 “;”
可以看到串連成功了,從而產生了可執行檔,當然這個可執行檔啟動並執行效果和第一種方式中一樣,
即看不到任何輸出
第三種方式:MASM For Windows 整合式開發環境
上面的兩種方式都顯得非常麻煩,編譯了還要串連,誰有那麼多時間去浪費啊,
所以,下面介紹的這個 MASM For Windows 整合式開發環境就顯得非常有優勢了,
軟體準備:
MASM For Windows 整合式開發環境,我這裡使用的是 2010 版本,大小 15.5 MB
實現 HelloWorld
直接開啟 MASM For Windows 整合式開發環境,然後找到範常式序,然後直接運行即可
可以看出,使用這個東東確實會方便很多很多
第四種方式:使用 Visual Studio 來實現開發組譯工具
軟體準備:
既然是使用 Visual Studio 來開發了,自然就需要 Visual Studio IDE 了,
在這裡呢,我使用的是 Visual Studio 2010 ,當然 2008 和 2005 都是可以的,
只不過在一些設定上有些許區別而已,在這裡,我也不做區分,大家感興趣的可以去網上淘一大把,
然後就是<<Intel 組合語言程式設計>>中的 Irvine 包,這個在網上也有一大把
VS 2010 設定:
在 VC++ 中建立一個空項目,取名為 Test
定製 VC++ 工程構建規則
設定完 VC++ 產生自訂項檔案後,再添加一個 C++ 檔案,並注意取名時尾碼名記為 .asm
設定 VC++ 工程的項目屬性
需要添加庫路徑,這裡的庫路徑指的是 <<Intel 組合語言程式設計>> 中的 Irvine 庫
設定包含路徑
設定依賴庫檔案,添加 Irvine32.lib
設定項目輸出
設定產生彙編代碼清單,添加 $(ProjectName).lst 屬性
Hello World 程式:
直接運行即可
結束語
花了這麼多的來介紹這四種組譯工具開發方式,也算是良苦用心了,事實上呢,這四種方式,
我們並沒有必要全部掌握,我們只需找到適合自己的方式即可,
比如,初學的話,我覺得 MASM For Windows IDE 就非常不錯,
而至於系統性的開發,尤其是對於 Win32 組譯工具的開發,則選擇 Visual Studio 是個不錯的選擇。
2010 年 11 月 05 日