SOGO論壇
  登入   註冊   找回密碼
查看: 678|回覆: 0
列印 上一主題 下一主題

[技術文章] 在 Visual Studio 中撰寫組合語言 [複製連結]

Rank: 11Rank: 11Rank: 11Rank: 11

熱心參予論壇活動及用心回覆主題勳章 數位硬體勳章

狀態︰ 離線
跳轉到指定樓層
1
發表於 2012-7-8 01:04:31 |只看該作者 |倒序瀏覽
在微軟的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 執行看看,以便觀察組合語言的執行過程,並進一步理解每個指令的意義。
喜歡嗎?分享這篇文章給親朋好友︰
               感謝作者     

請注意︰利用多帳號發表自問自答的業配文置入性行銷廣告者,將直接禁訪或刪除帳號及全部文章!
您需要登錄後才可以回覆 登入 | 註冊


本論壇為非營利自由討論平台,所有個人言論不代表本站立場。文章內容如有涉及侵權,請通知管理人員,將立即刪除相關文章資料。侵權申訴或移除要求:abuse@oursogo.com

GMT+8, 2024-5-12 22:40

© 2004-2024 SOGO論壇 OURSOGO.COM
回頂部