这是对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
...
}
FLAGS
和寄存器是否EFLAGS
被视为条件控制的一部分,以便将正确的信息传达给编译器?上面应该写成:
__asm__ volatile(
"rdrand %0 ; setc %1"
: "=r" (val), "=qm" (rc)
:
: "cc"
);
还是使用了"cc"
spurious?
我知道在不需要时使用它是无害的。从扩展 ASM:
如果您的汇编指令可以更改条件代码寄存器,请将“cc”添加到已破坏的寄存器列表中。某些机器上的 GCC 将条件代码表示为特定的硬件寄存器;'cc' 用来命名这个寄存器。在其他机器上,条件码的处理方式不同,指定 'cc' 无效。但无论什么机器都是有效的。
如果它是虚假的,它适用于哪些架构?(我假设 ARM 和CPSR
寄存器,但我可能弄错了)。