« 【ニコニコ動画】交響組曲ドラゴンクエスト4 謎の城 | トップページ | 坂之上の雲 スペシャルドラマ »

2008/12/09

MASMとか、Microsoft Macro Assemblerとか

今更、windows 32bitアプリケーションの設計法なんで覚える気も無いんだけど、あるツールを作りたくて、久しぶりにアセンブラを触る事となった。

折角なので、MASM 6.11の機能でも使ってみようかなぁ~とか思ったんだ。
え? MASM 8.0? そんなの知りません。

日本語の出版って、大抵がMASM 5.0時代のものなので、
6.x以降の擬似命令の事はないてない訳ですよ。
MSDNを読んだり、サンプルを見ながら、とりあえず、自分が使いそうな擬似命令を日本語で纏めてみた。

━━━━━━━━━━━━━━━━━━━━
proc ~ endp     プロシージャブロックの宣言
────────────────────
【書式】
label PROC [distance] [langtype] [visibility] []
          [USES reglist] [, parameter [:tag]]...

    statements

label ENDP

【パラメータ】
    [distance]     near
                far
    [langtaype]     c 引数はスタックへ C言語タイプ
    [visibility]     public
    []
    [USES reglist]     使用するレジスタ
    [, parameter [:tag]] 変数
        :tag  BYTE  1byte
            WORD  2byte
            DWORD  4byte
            QWORD  8byte
            TBYTE  10byte

【内容】
プロシージャーブロックの開始(PROC)と終了(ENDP)を宣言します。
プロシージャーは、CALL 命令またはINVOKEディレクティブで呼び出すことができます。

【展開】
label:
    push bp
    mov bp,sp
    push [USES reglist]で指定したレジスタ

    statements

    pop [USES reglist]で指定したレジスタ
    pop bp
    ret

━━━━━━━━━━━━━━━━━━━━
LOCAL     ローカル変数の宣言
────────────────────
【書式】
    LOCAL label([count])[:type]...

【パラメータ】
    label([count])[:type] 変数
        count     配列変数とし、配列数を定義する
        :type  BYTE  1byte
            WORD  2byte
            DWORD  4byte
            QWORD  8byte
            TBYTE  10byte

【内容】
    プロシージャの存続期間に存在するスタック形式の変数を作成します。
    label には、単純変数か、count 個の要素を持つ配列を指定できます。

━━━━━━━━━━━━━━━━━━━━
proto     プロシージャーのプロトタイプ宣言
────────────────────
【書式】
label PROTO [distance] [langtype] [, parameter [:tag]]...

【パラメータ】
    [distance]     near 64kbyteセグメント内
             far
    [langtaype]     c 引数はスタックへ C言語タイプ
    [, parameter [:tag]] 変数
        :tag  BYTE  1byte
            WORD  2byte
            DWORD  4byte
            QWORD  8byte
            TBYTE  10byte

【内容】
    プロシージャーのプロトタイプ宣言です。

━━━━━━━━━━━━━━━━━━━━
invoke     プロシージャーの呼び出し
────────────────────
【書式】
INVOKE expression [, arguments]

【パラメータ】
    [, arguments]     引数(レジスタ, アドレス, etc...)


【内容】
    expressionで指定したアドレス(ラベル)でプロシージャを呼び出します。
    その際、各言語の標準呼び出し規約に従って
    スタックまたはレジスタに引数を渡します。
    プロシージャに渡すことのできる引数は、
    式、レジスタのペア、アドレス式 (ADDR で始まる式) です。

━━━━━━━━━━━━━━━━━━━━
.IF~(.ELSEIF)~(.ELSE)~.ENDIF     条件分岐
────────────────────
【書式】
.IF [condition1]

    statements     ;condition1がtrueの時に実行

.ELSEIF [condition2]

    statements     ;condition2がtrueの時に実行

.ELSE

    statements     ;どれも該当しない時に実行

.ENDIF

【パラメータ】
    [condition1]     評価式 例えば、(ax>7)
    [condition2]     評価式

【内容】
    条件分岐のコードを生成します。

━━━━━━━━━━━━━━━━━━━━
.REPERT~.UNTIL(.UNTILCXZ)     条件付ループ
────────────────────
【書式】
.REPEAT

    statements     ;conditionがtureになるまで実行

.UNTIL [condition]
.UNTILCXZ


【パラメータ】
    [condition]     評価式 例えば、(ax>7)

【内容】
    条件付ループのコードを生成します。
    .UNTILの代わりに、.UNTILCXZを使用可。
    .UNTILCXZは、cxレジスタが0x0000の時にtrueになります。

━━━━━━━━━━━━━━━━━━━━
.WHILE~.ENDW     条件付ループ
────────────────────
【書式】
.WHILE [condition]

    statements     ;conditionがtureの間、実行

.ENDW

【パラメータ】
    [condition]     評価式 例えば、(ax>7)

【内容】
    条件付ループのコードを生成します。

━━━━━━━━━━━━━━━━━━━━
.BREAK     条件付ループ抜け
────────────────────
【書式】
.BREAK (.IF [condition])

【パラメータ】
    [condition]     評価式 例えば、(ax>7)

【内容】
    conditionがtrueの時に、.WHILE若しくは.REPERTを抜けます。

━━━━━━━━━━━━━━━━━━━━
.CONTINUE     条件付ループ
────────────────────
【書式】
.CONTINUE (.IF [condition])

【パラメータ】
    [condition]     評価式 例えば、(ax>7)

【内容】
    conditionがtrueの時に、.WHILE若しくは.REPERTの先頭にジャンプします。

━━━━━━━━━━━━━━━━━━━━

|

« 【ニコニコ動画】交響組曲ドラゴンクエスト4 謎の城 | トップページ | 坂之上の雲 スペシャルドラマ »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/36969/43371666

この記事へのトラックバック一覧です: MASMとか、Microsoft Macro Assemblerとか:

« 【ニコニコ動画】交響組曲ドラゴンクエスト4 謎の城 | トップページ | 坂之上の雲 スペシャルドラマ »