次の方法で共有


MASM 命令形式

構文

命令は次のような構文でソース コードに記述します。

prefixmnemonicoperand-list

命令の定義、オプション、エンコードについては、プロセッサの製造元のプログラミング マニュアルを参照してください。 Microsoft Macro Assembler ではサポートしていない命令や命令オプションもあります。

接頭辞

一部の命令の前には、その命令のエンコード方法のオプションを設定するキーワードを付けることができます。 REPREPEREPZREPNEREPNZ キーワードは文字列命令と共に使われ、1 つの命令で memcpy または strlen の種類の演算を行います。 LOCK キーワードを使うと、メモリ オペランドに対する特定の操作をアトミックにすることができます。 これを XACQUIREXRELEASE のキーワードと組み合わせると、サポートされるプロセッサ上で Hardware Lock Elision (HLE) を実行できます。これにより、場合によってはさらに大規模なトランザクション並列処理を実行できます。

その他のプレフィックスは、AVX 命令のエンコード方法を制御するために使います。 AVX 命令は VEX プレフィックスを使ってエンコードされます。これは、オペコードの前に指定します。 これは、特定のバイト命令プレフィックスやオペコードのリードイン バイトの代わりとなります。 多くの AVX 命令は AVX-512 命令でもあり、より多くのオプションをサポートする EVEX プレフィックスを使ってエンコードされています。 MASM では、可能な限り命令をコンパクトにエンコードしようと試行されますが、これらのキーワードを使うと、特定の命令にどのエンコードを使うかをより細かく制御することができます。 また、対応する AVX-512 命令の後に導入された AVX 命令形式を強制的に生成するためにも使われます。 たとえば vex vpdpbusd は、AVX512-VNNI 形式ではなく、VPDPBUSD 命令の AVX-VNNI 形式を指定しています。 AVX 命令に明示的なプレフィックス キーワードがない場合、選ばれるエンコードは現在の AVX エンコード設定によって変わります。 OPTION AVXENCODING ディレクティブを使うと、この設定を変更できます。

VEX2VEX3VEXEVEX オプションは、Visual Studio 2019 バージョン 16.7 以降で使用できます。

Keyword 使用法
REP (E)CX のカウントまで文字列操作を繰り返します。
REPE
REPZ
比較が等しい間は、(E)CX のカウントを上限として文字列操作を繰り返します。
REPNE
REPNZ
比較が等しくない間は、(E)CX のカウントを上限として文字列操作を繰り返します。
LOCK メモリ オペランドに対してアトミックに操作を実行します。
XACQUIRE HLE トランザクションを開始します。最もよく併用されるのは LOCK プレフィックスです。
XRELEASE HLE トランザクションを完了します。最もよく併用されるのは LOCK プレフィックスです。
VEX VEX プレフィックスを使って AVX 命令をエンコードします。
VEX2 2 バイトの VEX プレフィックスを使って AVX 命令をエンコードします。
VEX3 3 バイトの VEX プレフィックスを使って AVX 命令をエンコードします。
EVEX EVEX プレフィックスを使って AVX 命令をエンコードします。

ニーモニック

ニーモニックは、特定の命令を識別するものです。使用できるプレフィックスとオペランドのパターンを決定します。

オペランド一覧

ほとんどの命令では、オペランド一覧を使って、命令の明示的なソース オペランドと宛先オペランドを指定します。 オペランド一覧には、メモリ参照、レジスタ、定数値などを含めることができます。 各命令では、オペランド一覧の各位置に特定の種類のオペランドのみを指定できます。 MOVSCMPS の命令を除き、オペランドのうち 1 つのみをメモリ参照にすることができます。他のすべてのオペランドはレジスタ参照または定数にする必要があります。

AVX-512 のオプション

一部の AVX-512 命令では、より多くのオプションを指定できます。 マスク、ゼロマスク、埋め込みブロードキャスト、埋め込み丸め、例外の抑制といったオプションです。

"マスク" を使うと、選んだベクター要素にのみ演算を適用することができます。 このオプションは、{k1} から {k7} までのマスク レジスタを宛先オペランドの後に指定することで制御します。 マスク レジスタの後に {z} を指定すると、宛先の選ばれていない要素はすべて 0 に設定されます。 この代替手段は "ゼロマスク" と呼ばれます。

"埋め込みブロードキャスト" を使うと、メモリのスカラー値をベクターのすべての要素に適用することができます。 このオプションを有効にするには、要素サイズとキーワード BCST をメモリ オペランドに追加します。これは、通常のメモリ参照に PTR を使う場合と同様です。

"埋め込み丸め" を使うと、グローバルな丸めモードの設定やリセットを行うことなく、個々の浮動小数点演算命令の丸めモードを制御できます。 続けて丸めモードを中かっこで囲んだ命令を指定ることで有効になります。 有効にすると、その命令に対してのみ、例外もすべて抑制されます。 丸めを行わない浮動小数点命令も、同様のオプションを使ってすべての例外を抑制することができます。

  ; Examples of AVX-512 options
  vaddps xmm1 {k1}, xmm2, xmm3            ; merge-masking
  vsubps ymm0 {k4}{z}, ymm1, ymm2         ; zero-masking
  vmulps zmm0, zmm1, dword bcst scalar    ; embedded broadcast
  vdivps zmm0, zmm1, zmm2 {rz-sae}        ; embedded rounding
  vmaxss xmm1, xmm2, xmm3 {sae}           ; suppress all exceptions

丸めモード

モード 効果
rn-sae 近似値の偶数に丸め、すべての例外を抑制します。
rz-sae 0 に丸め、すべての例外を抑制します。
rd-sae (負の無限大に向かって) 切り捨て、すべての例外を抑制します。
ru-sae (正の無限大に向かって) 切り上げ、すべての例外を抑制します。
sae すべての例外を抑制します (丸め処理は不要)。

関連項目

Microsoft Macro Assembler リファレンス
プロセッサの製造元のプログラミング マニュアル