为什么GCC内联汇编程序要求您同时按位置和约束来指定输入/输出?

use*_*142 5 assembly gcc inline-assembly

GCC内联汇编器要求您分别列出输入和输出约束。但是,这还需要您在输出约束之前指定“ =”,根据手册表示“此操作数是只写的”。没有修饰符表示只读。现在,在我看来,只读/仅写与输入/输出之间存在细微的区别,因此对它们的区别对待。但是,如果gcc不相同,那么它们实际上如何区分“输入”和“只读”呢?在任何情况下,有人会在输入约束上加上“ =”,或者在输出约束上忽略它吗?对于“ +”(读和写)参数,将此参数放在输入部分还是输出部分有区别吗?将参数指定为“ +”约束与按以下方式指定有区别吗?

"some instruction" : "=r" : 0 :
Run Code Online (Sandbox Code Playgroud)

von*_*and 4

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

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

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