一些扩展的汇编语句使用goto
限定符无法使用 GCC 10.1.0 进行编译。具体来说,
int foo(int count)
{
asm goto ("dec %0; jb %l[stop]"
: "+r" (count)
:
:
: stop);
return count;
stop:
return 0;
}
(这是GCC 扩展 asm 文档中的示例) 无法编译并显示消息expected ‘:’ before string constant
。删除"+r" (count)
和dec %0
允许它成功编译,但无论我尝试什么,每当在同一 asm 语句中提供输出操作数作为 goto 标签时,它都会以同样的方式出错。
看来目前的发展海湾合作委员会文档 https://gcc.gnu.org/onlinedocs/gcc/您引用的内容适用于 GCC 的最新主干分支,不适用于 GCC 的任何官方版本。 GCC 官方版本目前尚不支持asm goto
具有任何输出或输入/输出约束。你可以在godbolt https://godbolt.org/z/PfMfa8。最新的 trunk 可以工作,但 10.2 和 10.1 不行。修复方法是等待 GCC 的下一个主要版本(版本 11.x);下载并编译最新的主干版本;修改内联程序集,使其不依赖于任何输出或输出/输入约束。
直到最近GCC 文档,最高版本 10.x https://gcc.gnu.org/onlinedocs/gcc-10.2.0/gcc/有这样说:
asm goto 语句不能有输出。这是由于内部
编译器的限制:控制转移指令不能有
输出。如果汇编代码确实修改了任何内容,请使用“内存”
clobber 强制优化器将所有寄存器值刷新到内存
如有必要,在 asm 语句后重新加载它们。
官方版本的所有文档和当前开发文档的列表可以在这里找到URL https://gcc.gnu.org/onlinedocs/。当前的开发文档位于页面底部。根据经验,您应该查阅您的特定 GCC 版本的文档。我相信所有 10.x 版本的文档与 GCC 网页上最新的 10.x 版本的文档相同。
最新版本的 CLANG/LLVM (11.0+) 确实支持此功能,但这也是相对较新的添加。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)