開始使用 MASM(中譯)

這篇文章好不容易從備份硬碟找出來,還好辛苦翻譯的沒有不見,看倌覺得有用就拿去用吧!下面的文章內容可能有些舊了,有空再更新吧!(2011/07/04)

Updated 3/4/2007
Hello 您好! 你買了Assembly Language for Intel-Based Computers, 第5版這本書, 現在你需要取得所有需要的軟體並且設定好以方便你開始工作。 我們會盡可能地讓這些程序很容易操作,假如你很急著要開始, 你只需要閱讀項目1. 然後其他的等有空再來閱讀。

  1. 32位元應用程式的設定

  2. 16位元程式的設定 (12-16章)

  3. 專案屬性的設定

  4. 從頭開始新增專案

  5. 產生原始碼列表檔案

  6. 使用Visual Studio 2005 debugger

  7. MASM 語法醒目功能

  8. 使用批次檔組譯 , 連結, 及偵錯

發現文件有錯誤?請立即email 給作者Kip Irvine, 翻譯上有什麼不妥處,也請mail給我, 除了有提到的,所有文件中的操作都可以用於Visual Studio 2005 及 Visual C++ 2005 Express版本。


32-位元應用程式的設定

假如你正使用Visual Studio 2005 Professional or Team Suite, 這些產品已經包含了Microsoft Assembler 8.0. 你可以跳過步驟1及2直接到步驟3。

步驟 1: 安裝 Visual C++ 2005 Express 版本

你購買的本書附有光碟片,光碟片中包含了Visual C++ 2005 Express 版本。你可以使用它來撰寫, 編輯, 編譯, 偵錯及執行你的組合語言程式, 假如你沒有收到光碟片,可以從微軟 下載這個軟體. (假如前面的連結已經改變, 到 http://msdn.microsoft.com/vstudio 搜尋這個版本下載.) 當你安裝Visual C++ 時, 注意一下C++編譯器被安裝的位置, 這個資訊在後面會用到. 從現在開始, 我們會從 Visual C++ Express 的名字中拋開"2005" 這個詞了。

步驟2: 下載並安裝Microsoft Assembler

瀏覽Microsoft’s MASM 8.0 下載網站。在微軟的網頁跟著下載及安裝的指示去作,假如這個連結壞了, 請 email讓我們知道

步驟 3: 安裝本書的範例程式

按下這個連結 取得本書最新的連結程式庫及範例程式, 這些範例被存在可以自動解壓縮到c:Irvine 資料夾的一個壓縮檔中。除非你不喜歡使用這個位置, 不然不要改變這個路徑, (實驗室管理員: 你可以將 c:Irvine 目錄指定為唯讀。) 假如你計畫改變安裝的位置, 請閱讀我們關於改變專案屬性 的相關操作指示. 下列的檔案也會被複製到 c:Irvine 目錄中:

Filename

Description

GraphWin.inc

Include file for writing Windows applications

Irvine16.inc

Include file used with the Irvine16 link library (16-bit applications)

Irvine16.lib

16-bit link function library used with this book

Irvine32.inc

Include file used with the Irvine32 link library (32-bit applications)

Link16.exe

16-bit linker

Irvine32.lib

32-bit link function library used with this book

Macros.inc

Include file containing macros (explained in Chapter 10)

SmallWin.inc

Small-sized include file, used by Irvine32.inc

User32.lib

Link library with Windows functions.

make16.bat

Batch file for building 16-bit applications

VirtualKeys.inc

Keyboard code definitions file, used by Irvine32.inc

有一個子目錄Examples 裡頭有本書所有的範例。

步驟4: 建置一個組合語言程式的範例
預備步驟: 設定定位點的大小為 5

開啟 Visual C++ Express, 並且從工具選單選擇選項, 選擇文字編輯器, 選擇 所有語言, 並且選擇 定位點:

20070606-1.png
設定定位點大小及縮排大小為 5。

開啟專案

Visual Studio 及 Visual C++ Express 需要組合語言原始碼屬於一個專案當作容器, 專案roject 會有像是組譯器, 連結器及所需程式庫的位置的設定資訊, 專案會有自己命名的資料夾以及所有的檔案都會在裡頭, 我們已經在c:IrvineExamples 目錄裡新增了專案的資料夾, 它的名稱是Project_Sample. 依序執行下面的步驟:

  1. 開啟 Visual Studio 或是 Visual C++ Express。

  2. 假如你使用 Visual Studio, 從檔案選單選擇 開啟專案。或者 , 如果你使用Visual C++ Express, 選擇 開啟, 然後選擇專案/方案。

  3. 點選到 c:IrvineExamplesProject_Sample 這個資料夾然後開啟Project.sln 這個檔案。

  4. 方案總管視窗裡, 這個項目左邊有個+的符號按下給它展開 , 用滑鼠雙按main.asm 這個檔案, 將它開啟在編輯的視窗裡, (Visual Studio 的使用者可能會看到一個彈出視窗詢問在asm檔案的編碼方式 , 只要按OK按鈕就可以繼續。)

提示: 假如 方案總管 視窗沒有看到, 在View選單中選擇方案總管, 另外如果你在方案總管視窗沒有看到main.asm 的話, 看一下視窗底下的tab鍵,按方案總管 tab。

在編輯視窗你將會看到下列的程式:

TITLE MASM Template				(main.asm)

; Description:
; 
; Revision date:

INCLUDE Irvine32.inc

.data
myMessage BYTE "MASM program example",0dh,0ah,0

.code
main PROC
    call Clrscr

    mov  edx,OFFSET myMessage
    call WriteString

    exit
main ENDP

END main
稍後, 我們將告訴你如何複製這個程式作為你自己程式的起點
程式建置

接下來, 你將要建置(組譯及連結)範例程式:

  • 假如你是使用Visual C++ Express, 從建置選單中選擇建置方案

  • 假如你是使用Visual Studio, 從建置選單中選擇建置專案

在螢幕下面的輸出視窗裡, 你應該會看到類似下面的訊息, 指示建置的程序:

------ 已開始建置: 專案: Project, 組態: Debug Win32 ------

Assembling...

Assembling: .main.asm

正在連結...

正在嵌入資訊清單...

已將建置記錄儲存於 "file://c:IrvineexamplesProject_sampleDebugBuildLog.htm"

Project - 0 個錯誤,0 個警告

========== 建置: 1 成功、0 失敗、0 最新、0 略過 ==========

假如你沒有看到這些訊息, 這個專案有可能再他上次建置的時候沒有再變更, 沒有問題–只要在文件裏的某個地方加個空白,儲存, 然後再試試建置。

執行程式

偵錯選單裡選擇啟動但不偵錯, 下面的控制台視窗應該會出現, 雖然你的視窗會比這一個大一點: 20070606-2.png

”請按任意鍵…” 訊息是Visual C++ Express 自動產生的. 恭喜您, 你已經執行了你的第一個組合語言的程式。 按任意鍵關閉控制台視窗。

當你組譯及連結這個專案時, 一個叫Project.exe 的檔案會在project的 Debug 資料夾下產生, 這個就是當你執行專案時執行的檔案, 你可以在Windows的檔案總管裡雙按Project.exe 這個檔案來執行, 但是它只會出現螢幕閃一下然後就不見, 那是因為在命令列視窗關閉前檔案總管沒暫停這個顯示。

新增你自己的專案

不久之後, 你會想要新增自己的專案, 最簡單的方式就是複製整個c:IrvineExamplesProject_Sample 資料夾到新的位置 , 並且你有讀寫的權限。(假如你在學校的電腦實驗室工作, 最好的位置就是使用USB隨身碟, 然後你可以修改程式,閒置,執行它。

步驟 5: 以偵錯模式來執行範例程式

在這個步驟裡, 你可以在範例程式裡設置中斷點, 然後你可以使用Visual C++ debugger 一次一個敘述地執行程式。

  1. 在偵錯模式下要開始逐步執行你程式, 按F10鍵。

  2. 有一個黃色的箭頭會出現在第一行程式敘述左邊(call Clrscr).這個箭頭表示下一行要被執行的敘述。

  3. 按 F10 鍵 (called Step Over) 來執行現在這個敘述 , 繼續按F10 直到程式執行到exit 敘述。

  4. 有一個小的黑色的視窗圖像出現在Windows的狀態列上, 開啟並檢視命令列視窗的內容 , 你會看到"MASM program example" 出現在視窗裡。

  5. 再按 F10 以結束程式。

20070606-3.png

暫存器

假如你想顯示CPU 的暫存器, 照著下面這樣做: 開始偵錯程式, 然後從偵錯選單中選擇視窗, 從下拉列表中選擇暫存器, 下面的視窗會顯示暫存器的內容, 對這個視窗按滑鼠右鍵並且將旗標這個項目勾選以開啟狀況旗標的顯示。你可以在偵錯選單裡選擇停止偵錯於任何時候中斷偵錯, 你也可以在工具列上按下藍色的按鈕20070612-1.png來中斷偵錯, 要從程式移除中斷點按下紅色的點它就會不見。

設定中斷點

假如你在程式設定中斷點, 你可以使用偵錯的功能來執行程式到這個中斷點, 在那一點,偵錯器來開始逐步執行。

  1. 在call WriteString 敘述左邊的邊緣按下滑鼠 , 在邊邊的地方會出現一個大的紅點。

  2. 從偵錯選單裡選擇開始偵錯, 程式會執行並且在中斷點這一行暫停 , 就像前面黃色箭頭所顯示那樣。

  3. 按 F10 直至程式完成。

你可以用滑鼠按下紅點來移除中斷點, 花幾分鐘來實驗偵錯選單的命令, 設定更多的中斷點再執行這個程式, 這一次你可以使用 F11 鍵來逐步執行就跟按 F10鍵那樣來偵錯。

建置並執行其他程式

假如你想要執行其他的程式, 或是想要新增自己的程式, 你可以編輯或修改這個main.asm, 或是你可以從project裡移除main.asm 然後插入其他的.asm 檔於 project裡。

  • 要從 project 移除程式不用刪除檔案, 在方案總管視窗裡的名字處按滑鼠右鍵 , 在選單裡選擇從專案移除, 假如你改變了想法決定將它再加回專案裡, 在相同的視窗那裡按滑鼠右鍵, 選擇加入, 選擇現有項目, 然後選擇你想新增的檔案。

  • 要從專案移除程式以及刪除原始碼, 可以用滑鼠選擇檔案按下Del 鍵 , 或者你可以用滑鼠右鍵這個檔案然後選擇移除。

新增檔案到專案裡

最簡單的方式就是從檔案總管拖拉組合語言的原始檔案到方案總管的專案名字上來加入到已開啟的專案, 在你的專案資料夾裡會有一個參考產生, 現在這樣試:

  1. 從你的專案移除main.asm 。

  2. 新增c:IrvineExamplesch03AddSub.asm 檔案參考給專案。

  3. 建置並執行專案。

下面是在終端視窗所看到的結果, 除了EAX暫存器相同的值外可能其他的值都跟我們的都不一樣:

當你按下任意鍵, 這個終端視窗就會關閉。

複製原始檔案

假如你想要現行檔案一個複製, 使用檔案總管來複製你的檔案到你的專案資料夾中, 然後在方案總管裡滑鼠右鍵於專案名稱處, 選擇新增, 選擇現有項目, 然後選擇檔案。 回到前面 或是閱讀有關 專案屬性的設定


建置16-位元應用程式(12-16章)

只有12 章到16 章需要建置16位元的應用程式, 除了一些例外會在本書中提到, 你的16位元的應用程式也可以在Windows XP 及 Windows Vista下執行。 假如你計畫建置16位元的應用程式,你需要在Visual C++ Express (或 Visual Studio)的工具選單新增兩個新的命令, 從工具選單裡的外部工具新增命令, 下面的對話會出現, 雖然在功能表內容裡的項目有很多可能沒有:

20070612-3.png

步驟 1: 新增 Build 16-bit ASM 命令

按下加入按鈕像上圖那樣填完標題, 命令,引數及初始目錄, 在命令及引數的右邊有一個箭頭, 按下箭頭會有一個便利的列表出現, 你可以不用擔心會拼錯:

20070612-5.png

按下 套用按鈕存取這個命令。

步驟2: 新增 Run 16-bit ASM 命令

按下加入按鈕新增一個新的命令叫做Run 16-bit ASM:

20070612-6.png

像上圖那樣填完資料後按下確定按鈕儲存命令然後關掉外部工具對話視窗。

測試你新的16位元命令

要測試你新的16位元命令, 在本書裡的範例程式中的ch03的資料夾開啟16-bit.asm 的檔案, 選工具選單裡選擇Build 16-bit ASM, 下面的命令視窗會出現, 顯示成功組譯及連結的執行, 以及跟程式相關的檔案列表:

20070612-7.png

按下任意鍵來關閉視窗, 接下來我們要執行程式, 在工具選單裡選擇Run 16-bit ASM , 下面的視窗會出現, 除了EAX暫存器的值一樣外其他的暫存器的值有可能會不一樣:

20070612-8.png

按下任意鍵來關閉視窗。 你已經完成了建置及執行16位元組合語言程式的設定。

回到前面

專案屬性設定(額外的主題)

我們想你可能會想知道更多有關Visual C++ 專案來設定組合語言程式。 假如是這樣, 我們會進行專案組態的重要部份。 假定我們的範例專案還開著, 從專案選單選擇Project 屬性, 按下組態屬性展開, 然後按下Microsoft Macro Assembler 8.0展開, 你會看到下圖這樣:

20070612-9.png

Microsoft Macro Assembler 8.0。 裡按下 General , 注意Include Paths 選項已經設為c:Irvine 目錄了, 這個選項可以告訴組譯器哪裡可以找到".inc"副檔名的檔案, 下面是個例子:

20070612-10.png

組態屬性裡找到連結器這個項目, 選擇輸入這個項目, 並且注意在其他相依性這個項目裡已經有兩個檔案被加入了, user32.lib 檔是標準的MS-Windows 檔案, irvine32.lib 檔案是本書提供的連結程式庫, 兩個檔案之間必須保留至少一個空白字元來分開:

20070612-11.png

接下來,仔組態屬性下選擇連結器, 然後選擇一般其他程式庫目錄選項會是 c:Irvine, 所以這個連結器可以找到 Irvine32.lib 這個程式庫檔案:

20070612-12.png

組態屬性下選擇連結器, 選擇偵錯, 注意產生偵錯資訊選項設為Yes: 20070612-13.png

連結器下選擇系統, 注意子系統選項設為主控台 (/SUBSYSTEM:CONSOLE): 20070612-14.png

我們使用主控台 (/SUBSYSTEM:CONSOLE)設定因為組合語言程式可以容易地輸出到文字視窗中, 這個視窗可以在開始>執行選單中執行cmd.exe 來看到。 按下確定按鈕來關閉 Project 屬性頁視窗。 回到前面


產生原始碼列表檔案

在 7/26/06之前, 書中下載的Visual Express 專案範例檔案不能產生原始碼listing files, 這裡會說明在單一專案如何改變: 開啟專案, 從選單選擇專案, 選擇專案屬性, 在列表裡面選擇Microsoft Macro Assembler, 然後選擇Listing File, 設定Assembled Code Listing file 選項為$(InputName).lst . 回到前面


從頭開始新增專案

你不需要完全自己來新增自己的專案, 坦白來講這很費功夫, 我們已經在本書的範例程式中的每個資料夾都複製了一份Project_sample 專案, 你只要在這些專案裡新增自己的程式就行了, 但是這裡要介紹如何新增自己的: 當然你可以命名你想要的專案, 但是我們現在假定你的專案是MyProject 來作為範例, 然後存到c:temp 目錄裡, 這些命令有點不同, 完全視你所使用的軟體而變:

Visual C++ Express

1. 從檔案選單選擇新增, 然後選擇專案。 2. 在新增專案視窗裡頭, 選擇一般, 然後選擇空專案作為專案型別: 20070612-15.png

你可能會將為方案建立目錄 選項不要勾選。 3. 按下確定來新增空專案。

Visual Studio
  1. 檔案選單裡選擇新增,選擇專案

  2. 在新增專案對話盒裡 (見下圖), 選擇其他語言, 選 Visual C++, 選 一般, 然後選 空專案.

  3. 給專案一個名稱以及選擇位置,不要改變任何其他選項。

  4. 按下確定按鈕。

你也可能想要將為方案建立目錄的選項不要勾選。

Visual Studio 及 Visual C++ Express
  1. 使用檔案總管或我的電腦從examplesProject_sample 資料夾複製main.asm 檔案道理要新增的專案裡 。 (在我們的範例裡這個資料夾命名為MyProject)。

  2. 回到Visual Studio 或 Visual C++ Express, 在方案總管視窗裡滑鼠右鍵按下你的專案名稱 , 選擇加入, 選擇現有項目, 然後選擇main.asm. (這個檔案可能不會出現, 你可以在檔名的對話盒輸入*.asm 看看。) 按下加入將它新增到你的專案裡。

  3. 從專案選單裡選擇自訂建置規則, 你會看到可用的規則檔的列表可能會跟我們的有所不同 , 在Microsoft Macro Assembler 這個選項給勾選:

20070612-16.png

按下確定按鈕來關閉這個視窗。

7. 接下來,你需要一些定製化, 我們會假設你已安裝了本書的檔案在c:Irvine 目錄裡, 依照文件裡的專案屬性設定這節來改變, 假如你不是安裝在c:Irvine, 你需要對專案屬性做些適當的改變。

8. 選擇 建置專案, 假如你的輸出視窗跟下面的訊息一樣, 那就表示你做對了:

------ 已開始建置: 專案: myProjet, 組態: Debug Win32 ------

Assembling... Assembling: .main.asm

正在連結...

正在嵌入資訊清單...

已將建置記錄儲存於 "file://c:tempmyProjetDebugBuildLog.htm"

myProjetc - 0 個錯誤,0 個警告

========== 建置: 1 成功、0 失敗、0 最新、0 略過 ==========

回到前面


MASM 語法醒目功能

在下面的圖示裡, Visual Studio 及 Visual C++ 2005 Express 可以將MASM 的保留字給醒目化: 20070612-17.png

這個功能需要兩個步驟來完成:

1) 下載Usertype.dat 檔到C:Program FilesMicrosoft Visual Studio 8Common7IDE 資料夾裡。

2) 開啟 Visual Studio 或 Visual C++ 2005 Express, 從工具選單裡選擇選項, 選擇文字編輯器, 選擇副檔名, 在右邊的對話盒裡輸入asm 作為副檔名, 從編輯器選擇Microsoft Visual C++, 然後按加入按鈕, 按確定來儲存你的改變。

20070612-18.png

 

回到前面

 

用批次檔來組譯,連結及偵錯

很多人喜歡用Windows 的批次檔來組譯及連結程式, 批次檔是一個文字檔裡面包含了一系列的命令來執行就像在命令列提示字元下輸入的一樣, 事實上,它們也夠威力來執行變數, 迴圈,IF 敘述等等。 要執行批次檔最簡單的方法就是先開啟命令列提示字元視窗,然後在提示下輸入批次檔的名稱來執行(有時需要參數), 要開啟命令列提示字元, 你必須執行一個叫cmd.exe 檔案, 我們會讓製作批次檔可以更簡單。 按滑鼠右鍵下載這個zip檔 , 這個檔含有下列的項目:

  • 一個到cmd.exe的捷徑, 可以在目前的目錄下開啟命令列提示字元

  • asm32.bat, 一個組譯及連結程式的批次檔

  • main.asm, 一個組合語言範例檔

在你的電腦上解壓縮這個壓縮檔在c:IrvineExamples 目錄裡, 然後照著下面的作:

  • 複製 asm32.bat 到你的系統路徑的任何一個目錄中 , 假如你使用Windows XP, 你可以存放到c:Windows 資料夾中。 (假如你使用Windows 2000, 存放到c:Winnt 資料夾中 。) 在你的系統路徑上有asm32.bat 允許你在命令列提示字元下輸入asm32 來執行。

  • 雙按cmd.exe 捷徑 , 命令列提示字元就會出現:

20070612-19.png

在這個視窗的命令提示下, 執行asm32 批次檔, 在輸入下面的命令後按下Enter:

    asm32

輸入下列的命令來組譯及連結一個叫main.asm的原始檔案:

    asm32 /L main

你應該會看到下列的訊息:

Assembling: main.asm
The file main.obj was produced. ..................................
Linking main.obj to the Irvine32, Kernel32, and User32 libraries.
The file main.exe was produced. ..................................

事實上有幾個檔案會產生。

  • main.obj – 目的檔

  • main.ilk – 累加連結狀態檔

  • main.pdb – 偵錯符號檔

假如這個程式有錯誤, 你可以看到組譯器產生的錯誤訊息, 這裡有個範例: Assembling: main.asm main.asm(9) : error A2008: syntax error : myMessage main.asm(15) : error A2006: undefined symbol : myMessage 你可以用文字編輯器(像是Notepad)來開啟main.asm, 修正錯誤, 再執行asm32批次檔。

雖然你在這個範例中使用叫main.asm 的檔案,asm32.bat 批次檔可以用來任何的組合語言檔案, 不論它的檔名, 唯一的需要是要有.asm 副檔名的組合語言程式。

在其他目錄裡組譯程式

無疑地, 你會想要在不同的資料夾下組譯程式, 不只是前述範例所使用的batch_sample 資料夾, 你所要作的就是複製cmd.exe 捷徑到任何你所要用的目錄下, 這個目錄是你放你的組合語言的位置, 當你雙按來執行這個捷徑時, 它會在目前的資料夾裡開啟一個命令列提示字元的視窗。

組譯,連結及偵錯

除了組譯及連結之外, 你可以使用asm32.bat 這個批次檔在Visual Studio debugger開啟你的檔案。 試試下面的命令:

    asm32 /L /D main

假如程式組譯及連結沒有錯誤, 你的程式就會載入到Visual Studio, 第一次你開始使用這個新的程式這個原始碼可能不會出現, 你要作的就是按下F10 鍵來開始偵錯, 而你的程式也會出現伴隨著一條黃色為底出現在程式的第一行:

(要是你的Visual Studio 如何設定, 你可能必須按F8 鍵才可以如此。) 從這裡,你可以逐步執行程式, 當你執行到call  WriteString這個敘述, 你可以按F11鍵進入它的程式, 當你結束時, 關閉 Visual Studio, 從這次開始, 當你在 Visual Studio debugger載入相同的程式時, 你的原始碼就會正確地出現。

只有組譯沒有連結

偶爾, 你可能想要組譯程式卻不連結, 舉例來說,當你建立一個多模組的專案,在你把它們連結成最後的執行檔之前你想要分別組譯每個asm檔案為 obj 檔, 或者, 你想要組譯一個模組新增進入一個連結的程式庫 (像是 Irvine32.lib), 要只組譯一個原始檔案, 輸入下列的命令:

    asm32 main

你應該會見到下列的輸出:

 Assembling: main.asm
The file main.obj was produced. ..................................

假如你有興趣學習更多有關批次檔的資訊, 這裡有一些連結可以參考:

連結很可能很快就會過期, 但是你可以用Google找 ,並且相信可以找到一堆的連結。

感謝你看到這裡,很快就可以離開了,但最好的獎勵行動就是按一下幫我分享或留言,感恩喔~

點我分享到Facebook

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *