编译器警告(等级 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 已被代码覆盖,因此程序将无法正常工作,甚至可能出错。