【问题标题】:Inline asm: push function parameters内联asm:推送函数参数
【发布时间】:2012-07-08 20:29:35
【问题描述】:

我在从内联汇编调用 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;
}

【问题讨论】:

  • 如果你把函数声明为裸函数,那么你负责设置ebp寄存器。

标签: c++ assembly parameters inline-assembly


【解决方案1】:

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

更具体地说,您的 _tmain 函数将值 3 传递给 asmfunc 按值,而不是按引用。换言之,asmfunc 对其本地整数“副本”所做的任何更新都不会被调用函数看到。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多