【发布时间】:2011-05-25 16:14:33
【问题描述】:
在 gcc 中开启 1 级优化后,我遇到了一个奇怪的问题。我所做的是保存标签并稍后从不同的函数返回到它。
void
UMS__suspend_procr( VirtProcr *animatingPr )
{
animatingPr->nextInstrPt = &&ResumePt;
[Some Code and inline volatile asm]
ResumePt:
return;
}
我做了一些这样的跳跃,它们都工作得很好。 问题是当我打开 O1 时,它没有保存正确的标签地址。相反,它会这样做:
804b14e: 8b 45 08 mov 0x8(%ebp),%eax
804b151: c7 40 14 4e b1 04 08 movl $0x804b14e,0x14(%eax)
804b158: 8b 55 08 mov 0x8(%ebp),%edx
所以程序甚至在分配之前就跳回来了。
【问题讨论】:
-
您知道获取标签地址是一种非标准语言扩展吗?因此完全不便携。
标签: c optimization gcc x86 label