SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

MASMとなでしこによるオリジナルコンパイラの制作

MASMとなでしこによるオリジナルコンパイラの制作 3

コンパイラを作成してコンパイルをする

コンパイラ完成

 ついにコンパイラが完成しました。さっそく、これをコンソールモードで実行ファイルにしましょう。まずVEFBLフォルダの中に、新たに「build」フォルダを作ります。その「build」フォルダに、「iolib.dll」をコピーします。次にコマンドラインから開き、cdコマンドを使いながら、「build」フォルダをカレントディレクトリにします。移動が終わってもコンソールは閉じないでおいてください。

VEFBL初コンパイル

 いよいよコンパイルです。「build」フォルダの中に「test1.txt」を新規作成し、以下の通りに記述します。

test1.txt
print "Hello Word!"

 このプログラムはどんな事をするか、予想つきますよね? それでは、先ほどカレントディレクトリを「build」フォルダに変更した状態のコンソールに、以下のコマンドを打ち込みます。

初コンパイル
..\build.exe test1.txt

 さぁ、コンパイルされたようです。エクスプローラから作成されたアセンブリファイルの内容を見るのもめんどうなので、コマンドプロントから見てしまいます。以下のコマンドを実行します。

作ったアセンブリを見る
type test1.txt.asm

 typeコマンドを実行すると指定したファイルの内容を表示することができます。すると次のような実行結果が表示されます。

実行結果
.586
.model flat, stdcall

include iolib.inc
includelib iolib.lib
include kernel32.inc
includelib kernel32.lib

.data
STR0 db "Hello Word!", 0

.code
_start:
invoke OutputString, offset STR0
invoke ExitProcess, 0
end _start

 まさに、これが出力したアセンブリの内容です。では、今度はアセンブルをしてみます。アセンブルのやり方は、さっきのやり方と同じです。

アセンブル
..\astest test1.txt

 これは奇妙な感じがしますね。「test1」に「.txt」の拡張子が付いているので、まるで「test1.txt」をアセンブルしているようです。この問題は、コンパイラがアセンブリを保存したファイル名が原因なのですが、この問題の解消は後回しにします。実行結果は次のようになります。

実行結果
C:\Documents and Settings\????????\My Documents\samples\codezine\vefbl
\build>Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.

 Assembling: C:\Documents and Settings\????????\My Documents\samples\c
odezine\vefbl\build\test1.txt.asm
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

以下のプロジェクトファイルを生成しました
test1.txt
test1.txt.asm
test1.txt.exe
test1.txt.obj

 きちんとアセンブルできました。では、実行ファイルを起動してみましょう。実行は「以下のプロジェクトファイルを生成しました」のリストにある、実行ファイルを表す拡張子「.exe」の文字列をそのまま記述すればOKです。

実行
test1.txt.exe

 すると、

初コンパイルプログラムの実行結果
Hello Word!

 と表示されます。もし「iolibがありません」と言われた方は、またしてもコピーを忘れたのだと思われます。コピーしてから再度実行してみてください。

 やっとコンパイラが作成し、そのコンパイラでコンパイルしたVEFBLプログラムが実行できました。これを作るまで、長い道のりでしたが、「これで終わりですね」ではなく「これから」なのです。今後、変数の操作、条件分岐、繰り返しについて一通りの実装をします。ですが、それらは次回以降に回すとして、作られたファイルの解説をします。

作成されたファイル

 コンパイルやアセンブルを実行してきて、出てきたいくつかのファイルがあります。

作成されたファイル
test1.txt
test1.txt.asm
test1.txt.obj
test1.txt.exe

 「test1.txt」はVEFBLスクリプトで、「test1.txt.asm」はコンパイラが作ったアセンブリ、「test1.txt.exe」は実行ファイルです。では、残りの1つは何でしょうか。

OBJファイル

 これは、オブジェクトといい、アセンブリをそのまま機械語にしたものです。ただ、これだけではプログラムは実行できません。なぜならこれは、アセンブリで書かれた部分だけを機械語にしたもので、アセンブリからインクルードされている「user32.lib」などは含まれていないからです。

 そのため、OBJファイルはリンクを行います。リンクとは、いくつかの機械語のファイルを結合することで、これにより実行ファイルができあがるのです。

回末後記

今回の回想

 長い間、いろいろ一生懸命になって準備して、ようやくコンパイラができました。といっても、出力するアセンブリは文字をコマンドプロンプト画面上に表示するものだけです(厳密に言うとメッセージボックスも表示できるのですが)。

次回予告

 次回は、メッセージボックスのタイトルを指定できるようにしたり、VEFBLで変数が使えるようにしたりします。また、余裕があれば、汎用プログラムによく使われるWin32APIも次々と実装していきたいと思います。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
MASMとなでしこによるオリジナルコンパイラの制作連載記事一覧

もっと読む

この記事の著者

KMY(かみぃ)

とあるごく平凡な中学生。兵庫県在住。日本語プログラミング言語「なでしこ」に惹かれ、たくさんのプログラムを作り利用している。なでしこ以外にも、他の言語を心得ており、HTMLがなでしこの次に得意であり、Perlが第3位(かも)。ベクターにも多彩な作品を残している。作文がど苦手。KMYpage

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/766 2007/03/08 19:10

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー