我有以下用户级线程库的调度代码。
代码可以通过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"
);
}
答案 0 :(得分:0)
感谢您的帮助,我找到了解决问题的方法。
通常将此函数编译为单独的.o文件,然后使用O3将其与其他文件进行优化。
使用内联汇编比此函数更容易和简单。如下所示:
int foo = 10,bar = 15; asm 易失性(" addl %% ebx,%% eax" :" = A"(富) :" a"(foo)," b"(bar) ); printf(" foo + bar =%d \ n",foo);
另一篇文章帮助我找出标签问题,请参阅此处:Labels in GCC inline assembly