Всеки път получавам различна върната стойност, така че правя нещо нередно. Ако заменя 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
? Компилаторът има право да извиква функции с техните аргументи в регистрите. Мисля, че вашият проблем е, че не сте положили никакви усилия да избегнете стъпването на компилатора, като декларирате вашите използвани регистри и т.н. Погледнете разглобяването на вашата програма за доказателство. - person Borealid   schedule 21.08.2010__declspec(naked)
? Сигурни ли сте, че трябва да направите това? Какво ще стане, ако не го направите? - person Greg Hewgill   schedule 21.08.2010