c - 在 gcc 中打开优化后标签移动

标签 c optimization gcc x86 label

在 gcc 中打开一级优化后,我遇到了一个奇怪的问题。我所做的是保存标签并稍后从不同的函数跳转回它。

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

所以程序甚至在赋值之前就跳回了。

最佳答案

此代码不是有效的 GNU C。首先,计算的 gotos (&&label) 是 GNU C 特有的功能,不是 C 语言的一部分,但如果您使用GNU C。但是,它们在 GNU C 中唯一有效的地方是带有 goto 语句。您不能将带有内联汇编的指针用作间接跳转/调用目标,因为调整堆栈帧取决于编译器,并且从内联汇编和标签目标的点来看堆栈帧的当前逻辑 View 可能不匹配.通过显式的 goto 语句,编译器可以对此进行修补,但对于 asm,它甚至无法判断它正在发生。

至于大局,如果您正在编写这样的代码,您真的应该重新考虑您的一些假设。肯定有更好的方法来完成您想要的。

关于c - 在 gcc 中打开优化后标签移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6127563/

相关文章:

c - 带负数的模运算

c - 在C中制作一个char数组

比较两个远程线程?

c - "unsupported for mov"GCC 内联汇编器

html - 我应该预加载折叠上方的大图像吗?

java - 优化递归算法以查找与特定正则表达式匹配的节点

c++ - 如何使用 gcc/g++ 在 Linux 上为 Windows 编译?

c - C : compare Strings 中的 qsort

python - pulp solve 函数给出相同的输出

c++11:clang 在我的模板定义中拒绝 numeric_limits<>,而 gcc 接受它 - 这是正确的吗?