如何让Inline程序集传递-O1优化

时间:2017-02-03 07:39:34

标签: gcc inline-assembly

我有以下用户级线程库的调度代码。

代码可以通过GCC并在没有优化的情况下正确运行,但如果我选择-O1优化(也是更高级别),则在运行代码时,程序会生成分段错误。

基本上该函数会保存上下文并跳转到下一个上下文。

void __attribute__ ((noinline)) __lwt_dispatch(lwt_context *curr, lwt_context *next)
{
__asm__ __volatile
    (

    "mov 0xc(%ebp),%eax\n\t"
    "mov 0x4(%eax),%ecx\n\t"
    "mov (%eax),%edx\n\t"
    "mov 0x8(%ebp),%eax\n\t"
    "add $0x4,%eax\n\t"
    "mov 0x8(%ebp),%ebx\n\t"
    "push %ebp\n\t"
    "push %ebx\n\t"
    "mov %esp,(%eax)\n\t"
    "movl $return,(%ebx)\n\t"
    "mov %ecx,%esp\n\t"
    "jmp *%edx\n\t"
    "return: pop %ebx\n\t"
    "pop %ebp\n\t"
    );
}

1 个答案:

答案 0 :(得分:0)

感谢您的帮助,我找到了解决问题的方法。

  1. 通常将此函数编译为单独的.o文件,然后使用O3将其与其他文件进行优化。

  2. 使用内联汇编比此函数更容易和简单。如下所示:

    int foo = 10,bar = 15; asm 易失性(" addl %% ebx,%% eax"     :" = A"(富)     :" a"(foo)," b"(bar)     ); printf(" foo + bar =%d \ n",foo);

  3. 另一篇文章帮助我找出标签问题,请参阅此处:Labels in GCC inline assembly