考虑以下简化示例函数:
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函数并使用内联汇编。)
答案 0 :(得分:0)
我可以简单地使用__attribute__((optimize("-fno-omit-frame-pointer")))
来防止这一功能中导致问题的优化。这可能是最好的解决方案。 - dreamlayers