Поделиться через


Предупреждение компилятора (уровень 1) C4731

"указатель" : регистр указателя кадра, измененный встроенным кодом сборки

Изменен регистр указателя кадра. Необходимо сохранить и восстановить регистр в встроенном блоке сборки или переменной кадра (локальная или параметрная, в зависимости от измененного регистра), или код может не работать должным образом.

Следующий пример приводит к возникновению ошибки 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 был перезаписан кодом, поэтому программа не будет работать должным образом и даже может сбой.