注) 2004年7月
アセンブリに関して、より使いやすい環境構築を目指して、追加ページを作りました。C言語でWin32APIを経験した程度のレベル向けで、このコーナーの、これからプログラムを始める初心者向けという範疇ではありませんが、参考になる部分もあると思うので、ご覧になってみてください。→こちら

第2章. アセンブリ言語

第2章が、アセンブリ言語だからといって、アセンブリから始めたほうがいいという意味では決してありません。アセンブリから始めたら、パソコンを壊すかもしれませんしね。全くの初心者は、この章は後回しにしたほうが良いでしょう
ただ、第1章で紹介した「はじめて読む8086」はアセンブリ言語の本ですし、C言語にはインラインアセンブラという技術もありますし、先に取り上げておこうかなと。

最初に

「はじめて読む8086」には、MS-DOSで、DEBUGモードでアセンブリ言語の学習をする方法が載っています。もちろんWindowsのDOS窓からでも演習できます。実行ファイルを作ることもできます。

これを、ネット上のコンテンツで説明してくれているのが、WisdomSoftさんのアセンブリ言語入門です。これを実践するのには、何ら特別な開発環境をインストールする必要はありません。Windows標準の機能さえあればいいのです。ぜひメモリやCPUの基礎をつかむ上でも、一度おやりになってみることをお勧めします。

さて、それ以上のことをやろうとすると、アセンブラが必要です。最も有名なのはMicrosoft Macro Assembler (MASM)ですが、これが手に入りにくい。文字通りマイクロソフトの著作物なのですが、無料でダウンロードできるものの中には、ml.exeはあるもののml.errがないなど、なかなかそろいにくいのです。

実はMASM32というフリーソフトがあり、これをインストールすればその中にMASMが完璧に含まれているのですが、無断再配布だと言われ続けている灰色のソフトです。しかしこのソフトは後述するように極めて魅力的なソフトであり、すでに数年の間堂々と公開されているにもかかわらず、あのうるさいマイクロソフト社から配布停止などの処置を食らっていないことを考えると、MS黙認のソフトと考えます。少なくても、使った人間が批判される筋合いはありません。

基本的な準備・設定

◎MASM32のインストール
インストールに関しては、S.S's HOMEPAGEさんのサイトのMASM32の遊び方のページに詳しく書かれています。

インストールに必要なファイルは、MASM32の開発者の1人である、Iczelion's Win32 Assembly Homepageダウンロードページで、まとめて入手できます。

まず MASM32 Version 8.2 をダウンロードします。

インストールは指示に従っていくだけです。唯一の選択は、インストール先のドライブを選ぶときのみです。
ドライブの選択
上図のように、あなたのPCのハードディスクドライブのドライブ名が一覧表示されます。1個だけの人もいれば、10個くらいある人もいるかもしれません。選んだドライブ(パーティション)のルートにMASM32というフォルダが作られます。上図の状態で設定すれば、C:\MASM32になります。もっと深い階層、たとえばC:\Program Files\MASM32とかにインストールすることはできません。

あとは、DOS窓が開いて何でもいいからキーを押すとかの操作があるだけです。インストールと同時にアセンブルしたりしているようで、多少の時間が掛かりますが、放っておけば自動で完了します。

以上の操作によりインストールされたMASM32のml.exeのバージョンは6.14です。そこで、より新しいバージョンの6.15で上書きするためにMASM 6.15 を同じページからダウンロードします。MASM 6.15を解凍して取り出したファイルで、MASM32のbinフォルダ内の同名ファイルを上書きします。

◎16ビット用リンカの準備
MASM32のbinフォルダにあるlink.exeは32ビット専用なので、16ビットで使う際は、別途リンカを用意する必要があります。これも、上のダウンロードページLink Version 5.63 をダウンロードします。自己解凍ファイルなので、一度実行してLINK.EXEを取り出してください。 このLINK.EXEをLINK16.EXEとリネームしてから、MASM32のbinフォルダに入れておきましょう

ここまで準備できたら、MASM32のbinフォルダにパスを通しておきます

いじくるつくーるの設定

【いじくるつくーる】をインストールして、右クリックメニューの拡張で、任意のファイルの1つ上のフォルダでMS-DOS(コマンド)プロンプトを開くにチェックをつけます。この機能は、あらゆる言語開発で、きわめて役に立つので、【いじくるつくーる】を未導入の方は、ぜひともインストールして、設定しておいて下さい。

演習方法

ここでは、書籍やネット上でよく見かける、16ビットのアセンブラの演習のやり方を説明します。

メモ帳などのテキストエディタでソースを書きます。最初は、ネット上の講座のサンプルソースを、コピペするのが良いでしょう。ここまでの設定がうまくいっているかを確認するために、実験してみましょう。

;例1 hello.asm
        assume cs:cseg,ds:dseg,ss:sseg
cseg    segment
start:
        mov ax,dseg
        mov ds, ax
        mov dx, offset msg
        mov ah, 09h
        int 21h
        mov ax, 4C00h
        int 21h
cseg    ends

dseg    segment byte
msg     db      'Hello !',0Dh,0Ah,'$'
dseg    ends

sseg    segment stack
        db      100h dup(?)
sseg    ends
        end     start

これをコピーして、エディタに貼り付け、hello.asm という名前で保存して閉じます。できたアイコンを右クリックし、コンテキストメニューから、「1階層上でMS-DOS(コマンド)プロンプト」を選ぶと、DOS窓が開きます。キャレットの行をみると、きちんと現在の階層がフルパスで表示されているはずです。CDコマンドなどの手間が省けて、実に効率的です。これは【いじくるつくーる】のおかげです。

この画面で、ml /c hello.asm と打ち込んで、Enterキーを押してください。エクスプローラで見ると、hello.obj というファイルが作成できたはずです。/cはリンカを呼ばないオプションで、objファイルを作るにとどめます。

次に、link16 hello; と打ってEnter。最後にセミコロンをつけるのをお忘れなく。今度は、hello.exe が出来たはずです。

最後に hello と打ってEnterすると、Hello !と表示されるはずです。これがうまくいかなければ、何か設定が間違っています。もう1度、設定を確認してください。

次にCOMファイル用実験サンプルです。テキストエディタで helloc.asm と名づけましょう。単一セグメントなので、短くなっていますね。

;例2 helloc.asm
        assume cs:cseg,ds:cseg,ss:cseg
cseg    segment
        org 100h
start:
        mov dx, offset msg
        mov ah, 09h
        int 21h
        mov ax, 4C00h
        int 21h
msg     db 'Hello !',0Dh,0Ah,'$'
cseg    ends
        end     start

同様に右クリックメニューからDOS窓を呼び出し、ml /c helloc.asmlink16 /tiny helloc;helloc を実行です。途中、スタックセグメントがないという警告が出ると思いますが無視してかまいません。link16のオプションとして、/tiny を付けるのがポイントです。

MASM32について

32ビットの話もしておきます。MASM32というくらいですから、こちらが本来の使い方です。

MASM32には、豊富なサンプルのソースと実行ファイルが添付されています。驚くべきは、その実行ファイルのサイズの小ささです。たとえば単純にメッセージボックスを出すプログラムは、1KBです。窓プログラムでも2.5KBとかです。逆アセンブルすると、無駄な部分が少ないことがわかります。

ただしこのテクニックを勉強しようとすると、大量の英語のドキュメントを読まねばならなくてウンザリという感じだったんですが、上で紹介したS.S's HOMEPAGEさんのサイトのMASM32の遊び方のページに、チュートリアルの翻訳がありました。スゴイです、これ。お礼を言いたいです。これを順に読むことで、豊富なサンプルファイルを理解することができそうです。ぜひ、ある程度CでSDKでプログラムをしている経験者に読んでほしいです。

付属のQuick Editor を使ってビルドすることで、特別にパスを通しておかなくても使えます。ただし、空白を含むパスにあるソースだとうまくいかないなどの不具合があるようです。


勉強になる&役に立つサイト

WisdomSoft アセンブリ言語入門の章において、DEBUGを使った基本が解説されています。
S.S's HOMEPAGE 上記の通り、MASM32を使う人は必見です。

あとは、eagle0wlさんのサイトかな。第1人者ですから。


目次へ>  <前の章へ>  <次の章へ