組合語言 -- 微軟的範例

組合語言

簡介

處理器

BIOS

啟動程式

微軟

組譯器

組合語言

DOS

Windows

VisualStudio

GNU

GNU 組譯器

C 轉組語

連結 C 語言

嵌入 C 語言

訊息

相關網站

參考文獻

最新修改

簡體版

English

在電腦越來越發達的時代,程式設計師與組合語言的距離就越來越遠了,這往往讓我們不知道如何在個人電腦上撰寫組合語言。對於那些曾經碰過 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,如下圖所示。

ml.png

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

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

範例一、加減法

檔案: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

Facebook

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License