GCC内联汇编程序要求您单独列出输入和输出约束。但是它还要求您在输出约束之前指定“=”,根据the manual表示“此操作数是只写的”。没有修饰符意味着只读。现在,在我看来,只读/只写和输入/输出之间存在细微差别,因此对它们的处理方式不同。但是,如果gcc不相同,它们如何实际区分“输入”和“只读”?有没有人会在输入约束上加上“=”,或者在输出约束上省略它?对于“+”(读取和写入)参数,将此参数放在输入部分与输出部分之间是否有区别?将参数指定为“+”约束与将其指定如下之间是否存在差异?
"some instruction" : "=r" : 0 :
答案 0 :(得分:3)
gcc-4.7.2的texinfo手册指出'='对输出约束是强制性的,输出操作数中的'+'表示它也可以是输入。规则有点复杂,仔细阅读手册。
据我所知,输入上的'='没有意义(只写 输入?!)。如果输入被修改,则将其列为输出(可能有几个!),可能将其与垃圾变量相关联,并通过数字约束将其与输出联系起来。
是的,这一切都让人感到困惑。这些约束来自GCC用于描述操作的内部语言,并且随着时间的推移而发展(具有一些向后兼容性,因为spice)。采用一些风格,并坚持下去。请记住,编译器会将您的asm()
代码段视为黑盒子,通过替换被告知的参数来复制,而不像处理预处理器宏那样。它不检查指令的寻址模式是否有意义,如果指令适用于您当前的机器,则不执行任何操作。只需将文本宏扩展并复制到程序集输出中。仔细检查你是说你的意思(希望像指令的寻址模式允许的那样自由,你不希望编译器通过扭曲来遵守不必要的限制;但是不允许指令不能处理的东西)。检查生成的组件!