我每次都得到不同的回报值,所以我做错了。如果我将添加替换为基本 inc ,则会正确返回。
这是代码。
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <iostream>
using namespace std;
int Add ( int _Number1, int _Number2 );
int main ( int _ArgumentCount, char * _Arguments[] )
{
int nInput, nOutput;
nOutput = Add ( 1, 1 );
cout << "1 + 1 = " << nOutput << endl;
cin >> nInput;
return 0;
}
__declspec ( naked ) int Add ( int _Number1, int _Number2 )
{
__asm xor eax, eax
__asm mov eax, _Number1
__asm add eax, _Number2
__asm ret
}
以下是新的有效代码:
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <iostream>
using namespace std;
int Add ( int Number1, int Number2 );
int main ( int ArgumentCount, char * Arguments[] )
{
int nInput, nOutput;
nOutput = Add ( 1, 1 );
cout << "1 + 1 = " << nOutput << endl;
cin >> nInput;
return 0;
}
int Add ( int Number1, int Number2 )
{
__asm mov eax, Number1
__asm add eax, Number2
}
答案 0 :(得分:4)
__declspec (naked)
表示创建的函数没有任何prolog或epilog代码 - 因此,如果要访问正式参数,则需要编写自己的prolog代码以便访问它们。你的xor
也没有任何效果,因为你立即用另一个值覆盖eax。另请注意,保留了以下划线后跟大写字母开头的任何标识符,因此您的代码具有未定义的行为。尝试将您的功能重写为:
int Add ( int number1, int number2 )
{
__asm mov eax, number1
__asm add eax, number2
}
或者编写代码来访问堆栈上的参数,而不依赖于序言:
__declspec (naked) int Add2(int number1, int number2) {
_asm mov eax, [esp+4]
_asm add eax, [esp+8]
_asm ret
}
我没有检查,但我猜你的原始代码试图从[ebp + 8]和[ebp + 12]加载参数。这取决于正常的prolog代码:
push ebp
mov ebp, esp
...您的__declspec (naked)
专门告诉编译器不生成。