C ++内联汇编功能无法正常工作

时间:2010-08-21 03:43:20

标签: c++ inline-assembly

我每次都得到不同的回报值,所以我做错了。如果我将添加替换为基本 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
}

1 个答案:

答案 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)专门告诉编译器生成。