Light Macro Assembler ホームページへ

スタンダードな COM プログラム

COM プログラムのソースコード例です。簡略化セグメントを使わないスタンダードな方法で記述したものです。


        assume  cs:cseg,ds:cseg,ss:cseg ; 各セグメント レジスタの宣言
cseg    segment                         ; セグメント cseg の開始

        org     100h                    ; PSP 領域の確保。COM 形式では必須
        mov     dx, offset msg          ; dx = ラベル msg のオフセット値
        mov     ah, 09h                 ; int 21h のファンクション番号
        int     21h                     ; 文字列の表示
        mov     ax, 4C00h               ; ah = 4Ch, al = OS戻り値 = 0
        int     21h                     ; DOS へ戻る

msg     db      'Hello !',0Dh,0Ah,'$'   ; 表示する文字列。'$'は終わりを示す記号

cseg    ends                            ; セグメント cseg の終了
        end                             ; プログラムの終了

このコードが書かれているテキスト ファイルの名前を「helloc.asm」とすると、LASM でアセンブルするには、コマンドラインで次のように入力します。

lasm helloc       helloc.obj が生成されます
lil helloc /c     helloc.com が生成されます
helloc           「Hello !」と表示されます

このプログラムについて

この helloc.asm について少し詳しく説明します。ただし、EXE 形式の hello.asm と重複する部分については説明を省略しますので、hello.asm の説明も合わせてご覧ください。


プログラムの概要

このプログラムは MS-DOS のファンクション 09h によって「Hello !」と表示し、ファンクション 4Ch によって終了します。COM 形式プログラムの特徴として、セグメントは 1 つしかありません。


assume 文によるセグメント レジスタの宣言

    assume cs:cseg,ds:cseg,ss:cseg
このプログラムでは、3 つのセグメント レジスタをすべて cseg に assume しています。これは EXE 形式の場合と異なります。COM 形式では、各セグメント レジスタは自動的にプログラムの先頭に位置付けられていからです。ただし、このプログラムでは assume 文の情報を使用していないので、assume 文は省略できます。


プログラムの先頭

    org   100h
この文は COM 形式プログラムに共通の特徴です。COM 形式のプログラムは必ず 256 バイト目、つまり 16 進数で 100h バイト目から開始されます。したがって、EXE 形式のように end 文に開始ラベルを指定する必要はありませんが、プログラム コードの先頭がちょうど 256 バイト目に来るように調節する必要があります。この文は、その役目を果たしています。

COM 形式プログラムの最初の 256 バイトは PSP (Program Segment Prefix) 領域と呼ばれ、OS によってコマンドライン引数などが置かれます。


データの定義

    msg   db   'Hello !',0Dh,0Ah,'$'
COM 形式ではセグメントが 1 つしかないので、メッセージ用のデータもコードと同じセグメントの中で定義します。注意しなければならないのは、データはプログラム コードとして実行されないような場所に置くということです。この helloc.asm では終了コードの後にデータを置いています。


スタック

COM 形式プログラムでもスタック領域は必要ですが、そのためのコードを記述する必要ありません。COM 形式の場合、ss:sp は始めからセグメントの末尾 (プログラムの先頭から 64KB 後) を指しているので、プログラムに割り当てられる 64KB のメモリの末尾部分がスタックとして使われることになります。

1997/5/29 created