まだMOV命令しかやっていないので、プログラムを作ることもできません。なぜなら、プログラムを終了して、処理をOS(このホームページではMS-DOSを前提としている)
に処理を戻すという処理もできないからです。しかし、実際にプログラムを実行しなければつまらないので、解説が出てくるまで丸暗記してほしい部分が結構あるがご了承ください。
ところで、MS-DOSの実行形式のファイルは3種類あります。拡張子が「.BAT」
、「.COM」そして「.EXE」です。「.BAT」はバッチファイルといって、実行したいプログラムをどのような順番で実行するかと言ったテキスト形式のもので、プログラムとはちょっと違います。詳しくはMS-DOSの本やマニュアルを参照してください。「.COM」ファイルは、マシン語の羅列です。扱うセグメントレジスタはすべて同じ値を示し、1つのセグメント領域しか使わないのです。つまりFFFFh(64Kbytes)を越えるプログラムは書けません。初心者にはこれが一番わかりやすいので、本ホームページはすべてこの形式で書いてあります。
「.EXE」ファイルは、複数のセグメントにわたってプログラムが書けます。一般には、プログラム本体が書いてあるセグメント、データを格納するセグメントと言った風に、用途によってセグメントを使い分けています。
では、下記のようなプログラムを書いてください。
CODE SEGMENT
ASSUME DS:CODE,CS:CODE,ES:CODE,SS:CODE
.186
ORG 100h
START:
mov ah,2
mov dl,'A'
int 21h
mov ax,4c00h
int 21h
ENDS
END START
; 一部のコンパイラでは、
;CODE ENDS
; END START
;と記述しなければいけないようです
|
青いところがプログラムです。黒いところは「.COM」ファイルを作るというおまじないです。本ホームページでは「.COM」しか扱わないので、以後この部分を省略しますが、プログラムを実際に作るときにはこの部分も入力してください。
まず1行目で、1つ目のセグメントの名前を「CODE」にすると定義しています。そして2行目で、DS,CS,ES,SSレジスタはこのCODEセグメントを指すようにしています。つまり1つのセグメントしか使わず、「.COM」
ファイルということになります。
3行目は80186以上のCPUを前提としていることをコンパイラに伝えています。
「.COM」ファイルでは、実際のプログラムが始まるのは、プログラムがロードされたセグメントの100h番地から始まるので、4行目でそのことを定義しています。
そして、最後の2行で、プログラムの終わりを宣言しています。プログラムの終わりというのは、
MS-DOSに戻るという意味ではなく、コンパイラにここまでがプログラムだよと伝えるだけです。
では次にプログラムの解説をします。
- mov ah,2
- 前のページで解説したMOV命令です。AHレジスタに2を代入します。
- mov dl,'A'
- 文字をシングルクォーテーションで囲うと、その文字コードを返します。すなわち、
'A'の文字コード41hをDLレジスタに代入しています。
- int 21h
- システムコールと呼ばれるもので、AH=2の状態でINT 21hを実行すると、
DLに入っている文字1文字ディスプレイに表示します。後で解説しますので、ここではそういうものだと覚えておいてください。
- mov ax,4c00h
- AXレジスタに4C00hを代入しています。
- int 21h
- これもシステムコールです。AXに4C00hが入っていると言うことは、AHに4Ch、ALに0が入っています。AHに4Chが入っているときにINT 21hを実行すると、プログラムが終了して、MS-DOSに処理が移ります。これも覚えておいてください。
|
さて、これを実行形式「.COM」ファイルにしなければなりません。エディターで上のプログラムを書いたら、「TEST.ASM」というファイル名で保存してください。(別にファイル名は好きなものでよいが、拡張子は「.ASM」)
- BorlandaのTurbo Assemblerの場合
-
- TASM TEST.ASM
- TLINK /t TEST.OBJ
の順で、実行します。最初の「TASM」で、エラーが出る場合には、どこか間違ってプログラムを書いていることになります。ここでエラーにならなくても、いざ実行するとエラーになったり、暴走したりすることもあるので、気をつけてください。
- MASM32の場合
-
- ml /c /Fl test.asm
- link /t test.obj,test.com,nul,nul
の順で、実行します。link.exeは、MASM32に同梱されている物ではなく、16bitリンカが必要になります。
できた「TEST.COM」を実行してみてください。「A」と表示されたら成功です。