这是后续扩展汇编器中的“=qm”是什么 https://stackoverflow.com/questions/21516852/what-is-qm-in-extended-assembler.
使用时RDRAND
,它设置(或取消设置)进位标志(CF
):
char rc;
unsigned int val;
__asm__ volatile(
"rdrand %0 ; setc %1"
: "=r" (val), "=qm" (rc)
);
// 1 = success, 0 = underflow
if(rc) {
// use val
...
}
Are the FLAGS
and EFLAGS
寄存器被视为条件控制的一部分,以便它向编译器传达正确的信息?上面的内容是否应该写成:
__asm__ volatile(
"rdrand %0 ; setc %1"
: "=r" (val), "=qm" (rc)
:
: "cc"
);
或者是使用"cc"
虚假的?
我知道如果不需要的话使用它是无害的。从扩展ASM http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html:
如果您的汇编指令可以更改条件代码寄存器,
将“cc”添加到被破坏的寄存器列表中。某些机器上的 GCC
将条件代码表示为特定的硬件寄存器; ‘抄送’
用于命名该寄存器。在其他机器上,条件代码是
处理方式不同,指定“cc”没有效果。但它是
无论什么机器都有效。
如果它是假的,它适用于哪些架构? (我认为 ARM 和CPSR
注册,但我可能弄错了)。
根据说明书,是的——cc
被破坏了。RDRAND
还设置 OF、SF、ZF、AF、PF
在实践中,gcc 假设__asm__
block always打击[E|R]FLAGS
x86 的条件代码寄存器。我没有参考资料,但你可以在类似的地方看到这个假设longlong.h
各种 GNU 包中使用的标头。
正如您所说,如果不使用它是无害的。因此,您不妨包含它,因为它仍然提供语义意图,或者最坏的情况是评论。还要考虑 Clang 和 ICC 实现 GCC asm 语法,如果它们遵循"cc"
破坏,而不是假设——尽管这不太可能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)