views:

51

answers:

1

I get a different return value each time, so I'm doing something wrong. If I replace the add with a basic inc, it returns correctly.

Here is the code.

#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
}

Here is the new, working code:

#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
}
+4  A: 

__declspec (naked) means the function is created without any prolog or epilog code -- so if you want to access formal parameters, you need to write prolog code of your own to give you access to them. Your xor is also accomplish nothing, since you immediately overwrite eax with another value. Also note that any identifier starting with an underscore followed by a capital letter is reserved, so your code had undefined behavior. Try rewriting your function as:

int Add ( int number1, int number2 )
{
    __asm   mov eax, number1
    __asm   add eax, number2
}

or else write the code to access the parameters on the stack without depending on a prolog:

__declspec (naked) int Add2(int number1, int number2) { 
    _asm mov eax, [esp+4]
    _asm add eax, [esp+8]
    _asm ret
}

I didn't check, but I'd guess your original code was trying to load the parameters from [ebp+8] and [ebp+12]. This depends on the normal prolog code:

push ebp
mov ebp, esp

...which your __declspec (naked) specifically told the compiler not to generate.

Jerry Coffin
+1 Nice! <......>
dirkgently
Thanks a bunch. I admit, when it didn't compile, and I found the naked "solution", I didn't even read into it. Very lazy of me.I also had no idea about the reserved names. Thanks a bunch, I've got it working now.
guitar-