gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:45:35 24 4
gpt4 key购买 nike

在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com