扩展汇编器中的“=qm”是什么

jww*_*jww 4 syntax x86 assembly gcc inline-assembly

我正在查看英特尔提供的RDRAND指令参考实现。该页面是英特尔数字随机数生成器(DRNG)软件实施指南,代码来自英特尔数字随机数生成器软件代码示例

以下是Intel的相关部分。它读取一个随机值并将其放入 中val,并在成功时设置进位标志。

char rc;
unsigned int val;

__asm__ volatile(
    "rdrand %0 ; setc %1"
    : "=r" (val), "=qm" (rc)
);

// 1 = success, 0 = underflow
if(rc) {
    // use val
    ...
}
Run Code Online (Sandbox Code Playgroud)

Soory不得不问。我认为GNU Extended Assembler中没有涵盖它,并且搜索“=qm”会产生虚假命中。

"=qm"扩展汇编器中的含义是什么?

小智 5

您看到的是内联汇编器约束。GCC 文档位于x86 系列部分下的6.47.3.1 简单约束6.47.3.4 特定机器的约束。这个 ( ) 结合了三个标志,表示:=qm

  • =:操作数是只写的 - 其先前的值不相关。
  • q:操作数必须位于寄存器abc或 中(例如,d不能位于 中)。esi
  • m:操作数可以放置在内存中。