__asm ブロックでの演算子の使用
Microsoft 固有の仕様
__asm
ブロックでは、<< 演算子などの C または C++ 固有の演算子を使用できません。 ただし、C および MASM で共有される演算子 (* 演算子など) は、アセンブリ言語演算子として解釈されます。 たとえば、__asm
ブロックの外側では、角かっこ ([ ]) は配列の添字を囲んでいると解釈され、C では配列内の要素のサイズに自動的に拡大縮小されます。 __asm
ブロックの内側では、MASM インデックス演算子と見なされ、(配列だけではなく) 任意のデータ オブジェクトまたはラベルからスケーリングされていないバイト オフセットが生成されます。 次のコードは、この違いを示しています。
int array[10];
__asm mov array[6], bx ; Store BX at array+6 (not scaled)
array[6] = 0; /* Store 0 at array+24 (scaled) */
array
への最初の参照はスケーリングされませんが、2 番目の参照はスケーリングされます。 TYPE 演算子を使用すると、定数に基づいてスケーリングできることに注意してください。 たとえば、次のステートメントは互いに対応しています。
__asm mov array[6 * TYPE int], 0 ; Store 0 at array + 24
array[6] = 0; /* Store 0 at array + 24 */
Microsoft 固有の仕様はここまで