Исключение при выполнении встроенной функции C ++: ошибка проверки времени выполнения # 0 - значение ESP не было правильно - PullRequest
0 голосов
/ 14 ноября 2011

Я пишу некоторые встроенные функции для удовольствия, и это вызывает исключение, с которым я никогда не сталкивался раньше. Самое смешное, что если я продолжу, после того, как исключение просто остановит поток выполнения моей программы, он вернет сумму двух целых чисел.

__declspec(dllexport) int addintegers(int one, int two)
{
    int answer = 0;
    __asm
    {
        mov eax, 0
        push two
        push one
        call add
        mov answer, eax
    }
    return answer;

} // Debugger stops here with exception message

Сообщение об исключении:

Ошибка проверки времени выполнения # 0 - значение ESP не было должным образом сохранено при вызове функции. Обычно это является результатом вызова функции, объявленной с одним соглашением о вызовах с указателем функции, объявленным с другим соглашением о вызовах.

// add function definition

int add(int one, int two)
{
    return one + two;
}

1 Ответ

4 голосов
/ 14 ноября 2011

Я не очень разбираюсь в ассемблере, и вы не показываете нам объявление add(), но если оно соответствует соглашению о вызовах C, вы должны вытолкнуть аргументы из стека после того, как вызов возвращен вызывающей стороне. ,

Требование, чтобы вызывающий объект очищал стек, а не вызываемый, - это то, что позволяет C иметь функции с переменным числом аргументов, например printf().

...