彙編程式開發環境搭配

BoyXiao發表於2018-08-07

 引子

  由於這些日子一直都在研究底層的技術,從 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 命令

image

  輸入 Edit 命令從而彈出彙編原始碼編輯框

image

image

  在原始碼輸入框中輸入彙編原始碼

image

  將編輯好的彙編原始碼儲存到 xx.asm 檔案中

image

image

image

  然後就是要編譯編輯好的彙編原始碼

  在 Dos 環境下進入到  MASM 5.0  彙編編譯器所在的目錄

image

  然後執行 masm.exe

image

image

  可以從上面的截圖中看到  [. ASM]  的標記,這個標記代表的是需要在這裡輸入要編譯的源程式檔名,

  這裡有一點特別的是,由於預設的副檔名為 .asm ,所以在編譯 .asm 的彙編源程式時可以不用指定源程式所在檔案的副檔名。

  我們將一開始編輯好的彙編源程式所在的檔案輸入以進行編譯

image

  指定檔案所在路徑後按  Enter  鍵

image

  此時可以看到編譯器提示需要輸入要編譯出的目標檔案的名稱,由於在一開始已經指定了 BoyXiao. asm ,

  所以編譯器自動指定了目標檔案的名稱為 BoyXiao. obj 的名稱,如果在這裡不做修改的話,

  則編譯器會以預設目標檔名稱 BoyXiao. obj 進行輸出,在這裡我並不改變名稱,所以直接按 Enter 鍵即可

image

  此時又提示需要輸入列表檔案的名稱,其實是完全可以不要讓編譯器生成這個 LST 檔案的,所以也不需要進行輸入,

  直接按 Enter 鍵即可

image

  此時又提示需要輸入交叉引用檔案的名稱,這裡也完全可以不要讓編譯器生成這個 CRF 檔案,

  所以也不需要進行輸入,直接按 Enter 鍵即可

image

  至此,彙編源程式編譯成功,

  編譯得到的結果就是在我的 E:\Tools\MASM\MASM 5.0 目錄下生成了一個 BoyXiao.obj 檔案

image

  下面就是要實現對目標檔案的連線

  經過編譯操作後,我們得到了一個 .obj 的目標檔案,但很顯然,這還並不是一個可執行檔案,

  下面就需要對目標檔案進行連線,從而得到一個可執行檔案。

  一般來說,需要準備一個聯結器,這裡我使用的是微軟提供的 Linker 聯結器,即 LINK.EXE ,

image

  進入 LINK.EXE 檔案所在目錄,直接執行 LINK.EXE

image

image

  此時提示需要輸入被連線的目標檔案的名稱,這裡也就是  BoyXiao.obj  ,

  由於我的 BoyXiao.obj 和 Link.exe 在同一目錄下,所以不需要指定路徑,直接給出 .obj 的名稱即可,

image

  按  Enter  鍵

image

  這裡提示需要輸入要生成的可執行檔案的名稱,此時如果想要將可執行檔案輸入到指定目錄下,

  則需要指定目錄,否則只需要指定名稱即可,並且可以看到名稱已有預設值:BOYXIAO.EXE

  在這裡我選擇預設值,所以直接按 Enter 鍵即可

image

  按  Enter  鍵

image

  又繼續提示需要輸入映像檔案的名稱,在這裡,不需要生成這個檔案,所以直接按 Enter 鍵即可

image

  此時又提示需要輸入庫檔案的名稱,由於我們的這個程式中沒有使用任何的子程式,

  也就是根本沒有呼叫什麼庫檔案,所以這裡也可以直接按 Enter  鍵處理

image

  至此,整個目標檔案的連線工作結束,得到的結果是一個 EXE 檔案

image

  執行彙編程式

image

  其實執行起來是看不到什麼結果的,因為上面的彙編程式碼沒有輸出任何內容,而只是改變了幾個暫存器的值而已,

  自然也就看不到任何的輸出了。 

  第二種方式:使用 Edit + MASM 5.0 編譯器 + Linker 聯結器 (簡化版)

  這種方式其實和第一種方式說不上有什麼區別,只不過在編譯和連線過程中使用了很多編譯器和聯結器的預設設定而已

  軟體準備:

  和第一種方式一樣 

  編輯彙編原始碼:

  和第一種方式一樣,也可以是直接使用文字編輯器編輯即可

  編譯編輯好的彙編原始碼

  直接到 MASM.EXE 檔案目錄,然後直接使用 masm 編譯指定路徑的檔案即可

  特別注意的是,需要在目錄的後面加上 “;”

image

image

  同樣在 E:\Tools\MASM\MASM 5.0 目錄下生成了  BoyXiao.obj 目標檔案

image

  實現目標檔案的連線

  同樣,直接下到聯結器 LINK.EXE 檔案所在的目錄,然後直接使用 LINK 連線指定的目標檔案即可

  同樣需要注意在目錄或檔名的後面加上 “;”

image

image

  可以看到連線成功了,從而生成了可執行檔案,當然這個可執行檔案執行的效果和第一種方式中一樣,

  即看不到任何輸出

image

  第三種方式:MASM For Windows 整合開發環境

  上面的兩種方式都顯得非常麻煩,編譯了還要連線,誰有那麼多時間去浪費啊,

  所以,下面介紹的這個 MASM For Windows 整合開發環境就顯得非常有優勢了,

  軟體準備:

  MASM For Windows 整合開發環境,我這裡使用的是 2010 版本,大小 15.5 MB

  實現 HelloWorld

  直接開啟 MASM For Windows 整合開發環境,然後找到範例程式,然後直接執行即可

image

image

  可以看出,使用這個東東確實會方便很多很多

  第四種方式:使用 Visual  Studio 來實現開發彙編程式

  軟體準備:

  既然是使用  Visual  Studio  來開發了,自然就需要  Visual  Studio  IDE 了,

  在這裡呢,我使用的是  Visual  Studio  2010 ,當然 2008 和 2005 都是可以的,

  只不過在一些設定上有些許區別而已,在這裡,我也不做區分,大家感興趣的可以去網上淘一大把,

  然後就是<<Intel  組合語言程式設計>>中的 Irvine 包,這個在網上也有一大把

  VS 2010 設定:

  在  VC++  中新建一個空專案,取名為  Test

image

  定製  VC++  工程構建規則

image

image

  設定完  VC++  生成自定義項檔案後,再新增一個  C++  檔案,並注意取名時字尾名記為  .asm 

image

  設定  VC++  工程的專案屬性

image

  需要新增庫路徑,這裡的庫路徑指的是 <<Intel  組合語言程式設計>> 中的 Irvine 庫

image

  設定包含路徑

image

  設定依賴庫檔案,新增 Irvine32.lib

image

  設定專案輸出

image

  設定生成彙編程式碼列表,新增  $(ProjectName).lst  屬性

image

  Hello World 程式:

image

  直接執行即可

image

 結束語

  花了這麼多的截圖來介紹這四種彙編程式開發方式,也算是良苦用心了,事實上呢,這四種方式,

  我們並沒有必要全部掌握,我們只需找到適合自己的方式即可,

  比如,初學的話,我覺得  MASM  For  Windows  IDE  就非常不錯,

  而至於系統性的開發,尤其是對於 Win32  彙編程式的開發,則選擇  Visual  Studio  是個不錯的選擇。

相關文章