gcc 中打开优化后标签移动

发布于 2024-11-09 09:43:15 字数 572 浏览 0 评论 0原文

在 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

因此程序甚至在分配之前就跳回。

I have a strange problem after turning on level 1 optimization in gcc. What I do is save the label and jmp back to it from a different function later.

void
UMS__suspend_procr( VirtProcr *animatingPr )
{ 
   animatingPr->nextInstrPt = &&ResumePt;


   [Some Code and inline volatile asm]

   ResumePt:
   return;

}

I do some of these jumps and they all work fine.
The problem is that when I turn on O1 it does not save the right label address. Instead it does this:

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

So the program is jumping back even before the assignment.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

绝不放开 2024-11-16 09:43:15

此代码不是有效的 GNU C。首先,计算 goto (&&label) 是 GNU C 特有的功能,不是 C 语言的一部分,但如果您是但是,它们在 GNU C 中唯一有效的地方是使用 goto 语句。您不能将指针与内联汇编一起用作间接跳转/调用目标,因为调整堆栈帧取决于编译器,并且从内联汇编和标签目标的角度来看堆栈帧的当前逻辑视图可能不匹配。使用显式的 goto 语句,编译器可以修复此问题,但使用 asm 时,它甚至无法知道它正在发生。

至于更大的图景,如果您正在编写这样的代码,您确实应该重新考虑一些假设。当然有更好的方法来实现你想要的。

This code is not valid GNU C. To begin with, computed gotos (&&label) are a feature specific to GNU C, not part of the C language, but that's ok if you're using GNU C. However, the only place they're valid in GNU C is with a goto statement. You cannot use the pointer with inline asm as an indirect jump/call destination, because adjusting the stack frame is up to the compiler, and the current logical view of the stack frame from the point of the inline asm and the label destination might not match. With an explicit goto statement, the compiler can patch this up, but with asm it can't even tell it's happening.

As for the bigger picture, if you're writing code like this, you should really rethink some of your assumptions. There's certainly a better way to accomplish what you want.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文