パスワードを忘れた? アカウント作成
66643 journal

L.Entisの日記: 【MASM談義】 補遺

日記 by L.Entis
MASM布教のために書いてきたわけですが、以下、実用する際に役立ちそうな補助情報など。

【目次】
0. 導入編
1. x86あらまし
2. 型と構造体
3. 定数、テキストマクロ
4. 条件と繰り返しマクロ
5. マクロ
6. マクロ関数
7. フロー制御ディレクティブ
8. 関数


【命令セット】
 Pentium Pro までの命令とMMX、SSE命令セットの生成を許可するには以下のディレクティブを記述します。

    .686
    .387
    .MMX
    .XMM

※実際には .686, .XMM の2行で大丈夫だと思います。


【インクルードファイル】
 C言語用のヘッダファイル(.h)をMASM用のインクルードファイル(.INC)に変換するには h2inc コマンドを使用します。
 VS .NET 2005 以降には h2inc は付属していないらしいので、それ以前のバージョンのものを探す必要があります。


【構造体アライメント】
 構造体をC言語との間で受け渡す場合にはアライメントに注意する必要があります。
 MASM で構造体のアライメントは

    DATA_TYPE   STRUCT   1
       ; ...
    DATA_TYPE   ENDS

のように STRUCT 文で指定できます。
 C 言語でのアライメントはコンパイラに依存します。
 MS-C++ の場合、

    #pragma    pack( push, __STRUCT_ALIGN__, 1 )
    struct { /* ... */ } ;
    #pragma    pack( pop, __STRUCT_ALIGN__ )

のように記述します。


【呼び出し規約】
 C言語からMASMの関数を呼び出す場合、またMASMからC言語の関数を呼び出す場合には呼び出し規約に注意する必要があります。
 通常、呼び出し規約にはC、またはSTDCALLを使うべきです。(MS-C++ で __cdecl(デフォルト), __stdcall)
 引数のレジスタ渡しを行う場合には MS-C++ コンパイラ依存で __fastcall を使用できます。__fastcall は引数2つまでを ecx, edx レジスタで渡すことが出来ます。

    void __fastcall func( int a, int b, int d ) ;

 この関数の実装はMASMで以下のように記述します。

    func   PROC   NEAR STDCALL PUBLIC, d:SDWORD
               ; ecx <- a,
edx <- b

 またクラスのメンバ関数は、(MS-C++では)this ポインタが ecx レジスタに渡されます。
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

長期的な見通しやビジョンはあえて持たないようにしてる -- Linus Torvalds

読み込み中...