インライン アセンブラーのラベルにジャンプ
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 固有の仕様はここまで