MASM 命令形式
構文
命令は次のような構文でソース コードに記述します。
命令の定義、オプション、エンコードについては、プロセッサの製造元のプログラミング マニュアルを参照してください。 Microsoft Macro Assembler ではサポートしていない命令や命令オプションもあります。
プレフィックス
一部の命令の前には、その命令のエンコード方法のオプションを設定するキーワードを付けることができます。 REP
、REPE
、REPZ
、REPNE
、REPNZ
キーワードは文字列命令と共に使われ、1 つの命令で memcpy
または strlen
の種類の演算を行います。 LOCK
キーワードを使うと、メモリ オペランドに対する特定の操作をアトミックにすることができます。 これを XACQUIRE
や XRELEASE
のキーワードと組み合わせると、サポートされるプロセッサ上で 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
ディレクティブを使うと、この設定を変更できます。
VEX2
、VEX3
、VEX
、EVEX
オプションは、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 命令をエンコードします。 |
略字
ニーモニックは、特定の命令を識別するものです。使用できるプレフィックスとオペランドのパターンを決定します。
オペランド一覧
ほとんどの命令では、オペランド一覧を使って、命令の明示的なソース オペランドと宛先オペランドを指定します。 オペランド一覧には、メモリ参照、レジスタ、定数値などを含めることができます。 各命令では、オペランド一覧の各位置に特定の種類のオペランドのみを指定できます。 MOVS
と CMPS
の命令を除き、オペランドのうち 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 |
すべての例外を抑制します (丸め処理は不要)。 |