在 Visual Studio 中撰寫組合語言

在微軟的Visual Studio 中,目前所使用的組譯工具是 ML.exe,ML.exe 除了進行組譯之外,還可以用來進行連結動作。但是,在 Visual Studio 整合環境中,我們並不需要使用指令的方式執行 ML.exe,因為我們可以利用功能表的方式,編譯組合語言程式,然後直接在 Visual Studio 中執行,甚至除錯。

要學習如何在 Visual Studio 環境中撰寫組合語言,則可以參考 Kip Irvine 的『Assembly Language for Intel-Based Computers, 5th Edition』一書,以及該書的網站 。在使用 Visual Studio 學習組合語言的開發之前,必須先學習如何設定其開發環境,Kip Irvine在網頁『Getting Started with MASM』 中詳細說明了這些設定方式,請有興趣的初學者仔細研讀。

範例一是 Kip Irvine 書籍中的一個範例,該範例會計算eax=0x10000+ 0x40000- 0x20000的結果,然後利用 DumpRegs 印出所有暫存器。該書的範例幾乎都會先以INCLUDE Irvine32.inc指令引用標頭檔,該指令會正確的引用像 DumpRegs 等函數,這讓讀者可以不需要一開始就學習輸出入的方式,降低了組合語言的學習難度。

範例一、以 Visual Studio 撰寫MASM組合語言的範例

TITLE Add and Subtract (AddSub.asm)
INCLUDE Irvine32.inc
.code                        ; 程式段開始
main PROC                    ; 主程式
    mov    eax,10000h        ; EAX = 10000h       ; 將 0x10000 存入 eax 當中
    add    eax,40000h        ; EAX = 50000h       ; 將 0x 40000 加到eax 當中
    sub    eax,20000h        ; EAX = 30000h       ; 從 eax 中減去 0x20000
    call    DumpRegs         ; 呼叫 DumpRegs 將所有暫存器印出
    exit                     ; 離開程式                      
main ENDP                                
END main

執行結果:

  EAX=00030000  EBX=7FFDF000  ECX=0012FFB0  EDX=7C92E514
  ESI=00000000  EDI=0B3DF9D4  EBP=0012FFF0  ESP=0012FFC4
  EIP=00401024  EFL=00000206  CF=0  SF=0  ZF=0  OF=0  AF=0  PF=1

讀者可以看到執行後,EAX 的內容為 0x30000,因此,該組合語言正確的執行了 eax=0x10000+ 0x40000- 0x20000的動作。現在,讀者可以在網路上下載該書的範例並執行看看,若您執行 AddSum.asm 這個程式,應可看到如圖一所顯示的執行畫面。

VisualStudioAssembly.jpg

圖一、在Visual Studio 中執行組合語言

VisualStudioAssembly.jpg

圖二、在Visual Studio 中執行 MASM 組合語言的結果

另外,在 Irvine.inc 檔案中,也引用了基本的字串函式庫,因此,您可以利用 call WriteString 這個指令,呼叫字串顯示函數,以便將字串輸出到螢幕上。圖三顯示了 main.asm 這個範例於 Visual Studio 中的情況,該程式會將字串 “MASM program example” 字串輸出到螢幕上。在 Irvine 的書籍中,還有許多進階的範例,您可以直接從網路上下載,然後利用 Visual Studio 執行看看,以便觀察組合語言的執行過程,並進一步理解每個指令的意義。

VisualStudioAssemblyString.jpg

圖三、用組合語言輸出字串到螢幕上

參考文獻

  1. Irvine 組合語言書籍的網址為http://kipirvine.com/asm/,其中書籍的前三章與所有範例程式,可以免費下載。
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License