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

发布于 2024-09-15 04:51:43 字数 1171 浏览 0 评论 0原文

我每次都会得到不同的返回值,所以我做错了。如果我用基本的 inc 替换 add ,它会正确返回。

这是代码。

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

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
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你穿错了嫁妆 2024-09-22 04:51:43

__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]。这取决于正常的序言代码:

push ebp
mov ebp, esp

...您的 __declspec (naked) 特别告诉编译器生成。

__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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文