我正在编写一些内联函数以获得乐趣,它会抛出我以前从未遇到过的异常。有趣的是,如果我继续,在异常刚刚停止执行我的程序之后,它将返回两个整数的总和。
__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;
}
答案 0 :(得分:4)
我对汇编程序了解不多,而且你没有向我们展示add()
的声明,但是如果它遵守C&C的调用约定,你必须弹出参数调用返回给调用者后从堆栈中。
要求调用者清理堆栈而不是被调用者,这是允许C具有可变数量的参数的函数,例如printf()
。