陳鍾誠

Version 1.0

組合語言 – 微軟的範例

在電腦越來越發達的時代,程式設計師與組合語言的距離就越來越遠了,這往往讓我們不知道如何在個人電腦上撰寫組合語言。對於那些曾經碰過 DOS 系統的人而言,撰寫組合語言是常見的事情,但是自從 Windows 加入保護功能之後,這些 DOS 的組合語言就再也不能執行了,要在 Windows 系統下撰寫組合語言,成了一種很少人會的絕技。

但是,其實在 MS. Windows 之下撰寫組合語言並沒有那麼困難。要在微軟的平台上撰寫組合語言,最簡單的方式是安裝 Visual Studio Professional,然後啟動 Visual Studio 的命令列工具,舉例而言,在筆者的電腦上安裝有 Windows XP + Visual Studio Professional 2008,筆者只要啟動「開始/所有程式/Microsoft Visual Studio 2008/Visual Studio Tools/Visual Studio 2008 命令提是字元」後,就可以打入 ml 指令看看是否具有微軟的組譯器 ml.exe,如下圖所示。

圖一、測試微軟的組譯器是否存在

一但有了這個組譯器,您就可以開始撰寫微軟的組合語言了,以下是一些組合語言的程式範例,以及筆者的執行情況。

範例一、加減法

檔案:add.asm

.386 .model flat INCLUDELIB LIBCMT printf PROTO C, format:PTR BYTE, args:VARARG .data num DWORD 0 formatStr BYTE “num=%d”, 0dh, 0ah, 0 PUBLIC _main .code _main PROC MOV eax, 1 ADD eax, 4 SUB eax, 2 MOV num, eax INVOKE printf, ADDR formatStr, num ret 0 _main ENDP END 執行結果

D:\code\ASM>ml add.asm Microsoft (R) Macro Assembler Version 9.00.21022.08 Copyright (C) Microsoft Corporation. All rights reserved.

Assembling: add.asm Microsoft (R) Incremental Linker Version 9.00.21022.08 Copyright (C) Microsoft Corporation. All rights reserved.

/OUT:add.exe add.obj

D:\code\ASM>add num=3 範例二、計算總和

檔案:sum.asm

.386 .model flat INCLUDELIB LIBCMT printf PROTO C, format:PTR BYTE, args:VARARG .data sum DWORD 0 formatStr BYTE “sum=%d”, 0dh, 0ah, 0 PUBLIC _main .code _main PROC MOV eax, 1 FOR1: ADD sum, eax ADD eax, 1 CMP eax, 10 JLE FOR1 INVOKE printf, ADDR formatStr, sum ret 0 _main ENDP END 執行結果

D:\code\ASM>ml sum.asm Microsoft (R) Macro Assembler Version 9.00.21022.08 Copyright (C) Microsoft Corporation. All rights reserved.

Assembling: sum.asm Microsoft (R) Incremental Linker Version 9.00.21022.08 Copyright (C) Microsoft Corporation. All rights reserved.

/OUT:sum.exe sum.obj

D:\code\ASM>sum sum=55