内联asm:推送函数参数

Inline asm: push function parameters

本文关键字:函数 参数 asm 内联      更新时间:2023-10-16

我在从内联程序集中调用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;
}

您是否尝试过在调试器下遍历代码,以可视化和理解其执行?从长远来看,你可能会发现这很有用。

更具体地说,_tmain函数通过值将值3传递到asmfunc,而不是通过引用传递到。换句话说,asmfunc对其整数的本地"副本"所做的任何更新都不会被调用函数看到。

您可以考虑让asmfunc尝试返回更新后的值,然后在_tmain中显示该值。