【发布时间】:2010-08-21 12:13:30
【问题描述】:
我每次都得到不同的返回值,所以我做错了。如果我将 add 替换为基本的 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
}
【问题讨论】:
-
你怎么知道
_Number1不是eax?允许编译器调用带有寄存器中参数的函数。我认为你的问题是你没有做出任何努力来避免通过声明你使用的寄存器等来避免踩到编译器的脚趾。看看你的程序反汇编来证明。 -
你为什么使用
__declspec(naked)?你确定你需要这样做吗?如果不这样做会怎样? -
@Borealid - 这是我的第一次尝试,不太确定我在做什么。我认为 EAX 是为返回值保留的,我应该使用哪些寄存器? @Greg - 没有它会有一些编译问题。谷歌搜索,论坛上一个人说要使用裸声明。
标签: c++ inline-assembly