5

GCC 内联汇编器要求您分别列出输入和输出约束。但是它还要求您在输出约束之前指定“=”,根据手册表示“此操作数是只写的”。没有修饰符意味着只读。现在,在我看来,只读/只写和输入/输出之间存在细微差别,因此它们的处理方式不同。但是如果它们不相同,gcc 如何实际区分“输入”和“只读”?是否存在将“=”放在输入约束上或在输出约束上省略它的情况?对于“+”(读取和写入)参数,将此参数放在输入和输出部分是否有区别?将参数指定为“+”约束与将其指定如下有区别吗?

"some instruction" : "=r" : 0 :
4

1 回答 1

3

gcc-4.7.2 的 texinfo 手册指出“=”对于输出约束是强制性的,并且输出操作数中的“+”意味着它也可以是输入。规则有些复杂,请仔细阅读手册。

据我了解,输入上的“=”毫无意义(仅限书面 输入?!)。如果修改了输入,请将其列为输出(可能有多个!),也许将其与垃圾变量相关联,并通过数字约束将其与输出联系起来。

是的,这一切都相当令人困惑。约束来自 GCC 用来描述操作的内部语言,并且随着时间的推移而演变(一些向后兼容性引发了它的趣味性)。采用一些风格,并坚持下去。请记住,编译器将您的asm()代码段视为一个黑盒,通过替换告知的参数来复制,就像处理预处理器宏一样。它没有检查您的指令的寻址模式是否有意义,如果指令适用于您当前的机器,则没有。只是要宏扩展并复制到程序集输出中的文本。仔细检查你说的是什么意思(希望像指令的寻址模式允许的那样自由,你不希望编译器通过扭曲来遵守不必要的限制;但不允许指令不能处理的东西)。检查生成的程序集!

于 2013-02-04T17:42:07.127 回答