0

インライン アセンブリからの C++ 関数の呼び出しに問題があります。必要なパラメーターをスタックにプッシュする必要がありますが、何か問題が発生しています。たとえば、をプッシュする3と、すべて正常に動作しますが、(関数から) または (同じことで) 変数の値をプッシュしようとすると、実際の値に関係なく、呼び出された関数によって[ebp+8]誤って受信されます。1

int i;

DWORD nietgebruikt(DWORD x)
{
    // x is always 1
    x += 40;
    return x;
}

_declspec(naked) void asmfunc(DWORD x)
{
    _asm
    {
        push    x; // or [ebp+8]
        call    nietgebruikt
        pop x // or [ebp+8]

        add i,  eax
        ret
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    i = 1;

    asmfunc(3);

    cout << i << endl;
    system("pause");

    return 0;
}
4

1 に答える 1

0

コードの実行を視覚化して理解するために、デバッガーの下でコードをステップ実行してみましたか? おそらく、長期的には非常に役立つでしょう。

より具体的には、関数は値を参照ではなく_tmainで渡しています。つまり、整数のローカル「コピー」に対して行われた更新は、呼び出し元の関数には表示されません。3asmfunc asmfunc

asmfunc代わりに更新された値を返してみて、その値を に表示することを検討してください_tmain

于 2012-07-08T22:02:00.287 に答える