インライン アセンブラーのラベルにジャンプ

Microsoft 固有の仕様

通常の C または C++ のラベルと同様に、__asm ブロック内のラベルのスコープは、それが定義されている関数全体になります (ブロック内だけではありません)。 アセンブリ命令と goto ステートメントのどちらからも、__asm ブロックの内側または外側のラベルにジャンプできます。

__asm ブロックで定義されているラベルは大文字と小文字が区別されません。goto ステートメントとアセンブリ命令は、大文字小文字に関係なく、これらのラベルを参照できます。 C と C++ のラベルは、goto ステートメントで使用される場合にのみ、大文字と小文字が区別されます。 アセンブリ命令は、大文字小文字に関係なく、C または C++ のラベルにジャンプできます。

次のコードは、すべての順列を示しています。

void func( void )
{
   goto C_Dest;  /* Legal: correct case   */
   goto c_dest;  /* Error: incorrect case */

   goto A_Dest;  /* Legal: correct case   */
   goto a_dest;  /* Legal: incorrect case */

   __asm
   {
      jmp C_Dest ; Legal: correct case
      jmp c_dest ; Legal: incorrect case

      jmp A_Dest ; Legal: correct case
      jmp a_dest ; Legal: incorrect case

      a_dest:    ; __asm label
   }

   C_Dest:       /* C label */
   return;
}
int main()
{
}

C ライブラリ関数名を __asm ブロック内のラベルとして使用しないでください。 たとえば、次のように、exit をラベルとして使用する可能性があります。

; BAD TECHNIQUE: using library function name as label
   jne exit
   .
   .
   .
exit:
   ; More __asm code follows

exit は C ライブラリ関数の名前であるため、このコードによって、目的の場所ではなく exit 関数へのジャンプが発生する可能性があります。

MASM プログラムと同様に、ドル記号 ($) は現在の位置カウンターとして機能します。 これは、現在アセンブルされている命令のラベルです。 __asm ブロックでは、次のように、主に長い条件付きジャンプを行うために使用されます。

   jne $+5 ; next instruction is 5 bytes long
   jmp farlabel ; $+5
   .
   .
   .
farlabel:

Microsoft 固有の仕様はここまで

関連項目

インライン アセンブラー