繁体   English   中英

带有 goto 的扩展 asm,包括来自 gcc 文档的示例,无法编译

[英]Extended asm with goto, including an example from the gcc docs, fails to compile

一些使用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允许它成功编译,但无论我何时尝试在与 goto label 相同的 asm 语句中提供 output 操作数时,它都会以同样的方式出错。

您正在参考的当前开发GCC 文档似乎适用于 GCC 的最新主干分支,不适用于 Z32D8B233E3C58A262A0B7587229 的任何官方版本。 GCC 的官方版本目前不支持带有任何 output 或输入/输出约束的asm goto 你可以在Godbolt上看到这个。 最新的主干有效,但 10.2 和 10.1 无效。 修复方法是等待 GCC(版本 11.x)的下一个主要版本; 下载并编译最新的主干版本; 修改您的内联程序集,使其不依赖任何 output 或输出/输入约束。

直到最近,GCC 版本 10.x 的文档都这样说:

asm goto 语句不能有输出 这是由于编译器的内部限制:控制转移指令不能有输出。 如果汇编程序代码确实修改了任何内容,请使用“内存”破坏程序强制优化器将所有寄存器值刷新到 memory 并在 asm 语句之后重新加载它们(如有必要)。

可以在此URL中找到正式版本的所有文档和当前开发文档的列表。 当前的开发文档位于页面底部。 经验法则是您应该查阅 GCC 特定版本的文档。 我相信所有 10.x 版本文档与 GCC 网页上的最新 10.x 版本文档相同。

最新版本的 CLANG/LLVM (11.0+) 确实支持此功能,但这也是相对较新的添加。

asm goto 不允许 output 操作数。

这是一个 gnu 决定。 在来自 c-parser.c 的 function c_parser_for_statement 中,您可以找到:

/* For asm goto, we don't allow output operands, but reserve
the slot for a future extension that does allow them.  */

https://github.com/gcc-mirror/gcc/blob/releases/gcc-10/gcc/c/c-parser.c

然而,这种情况可能会改变,因为在主分支中,这条评论不再存在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM