如何在更改sp时访问GCC内联汇编中的局部变量?

时间:2014-12-13 06:42:46

标签: gcc inline-assembly gcc4

考虑以下简化示例函数:

void foo(void) {
    int t;
    asm("push %0\n\t"
        "push %0\n\t"
        "call bar"
        :
        : "m" (t)
        :
        );
}

如果我在没有优化的情况下使用Cygwin x86 gcc 4.8.3进行编译,则推送指令将变为:

push -4(%ebp)
push -4(%ebp)

这很好。问题发生在-O:

push 12(%esp)
push 12(%esp)

这显然是错误的。第一次推送改变esp,然后第二次推送访问错误的位置。我有read that adding "%esp" to the clobber list should fix it,但没有帮助。如何让GCC使用帧指针或正确考虑esp更改?

(假设从bar函数返回将esp设置为asm语句之前的值。我只需要调用thiscall函数并使用内联汇编。)

1 个答案:

答案 0 :(得分:0)

我可以简单地使用__attribute__((optimize("-fno-omit-frame-pointer")))来防止这一功能中导致问题的优化。这可能是最好的解决方案。 - dreamlayers