次の方法で共有


コンパイラの警告 (レベル 1) C4731

'pointer': インライン アセンブリ コードによって変更されたフレーム ポインター レジスタ 'register' です

フレーム ポインター レジスタが変更されました。 インライン アセンブリ ブロック内のレジスタまたはフレーム変数 (変更されたレジスタに応じてローカルまたはパラメーター) を保存して復元する必要があります。そうしないと、コードが適切に動作しない可能性があります。

次の例では C4731 が生成されます。

// C4731.cpp
// compile with: /W1 /LD
// processor: x86
// C4731 expected
void bad(int p) {
   __asm
   {
      mov ebp, 1
   }

   if (p == 1)
   {
      // ...
   }
}

EBP はフレーム ポインターであり (FPO は許可されません)、変更されています。 p は後で参照されるとき、EBP を基準として参照されます。 しかし、EBP はコードによって上書きされているため、プログラムが適切に動作しません。フォールトが発生する場合もあります。