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