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

时间:2014-02-02 22:02:57

标签: gcc assembly syntax x86 inline-assembly

我正在查看英特尔提供的RDRAND指令的参考实现。该网页为Intel Digital Random Number Generator (DRNG) Software Implementation Guide,代码来自Intel Digital Random Number Generator software code examples

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

char rc;
unsigned int val;

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

// 1 = success, 0 = underflow
if(rc) {
    // use val
    ...
}

Soory要问。我认为它不在GNU Extended Assembler中,并且搜索“= qm”会产生虚假命中。

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

3 个答案:

答案 0 :(得分:4)

你所看到的是inline assembler constraint。 GCC文档位于 x86系列部分下的6.47.3.1 Simple Constraints6.47.3.4 Constraints for Particular Machines。这一个(=qm)组合了三个标志,表示:

  • =:操作数是只写的 - 它的先前值不相关。
  • q:操作数必须在注册abcd(不能在esi中,例如)。
  • m:操作数可以放在内存中。

答案 1 :(得分:2)

qm可能意味着1字节8位mem = qm将是存储1字节结果的有效约束 看看setc想要什么

http://web.itu.edu.tr/~aydineb/index_files/instr/setc.html

reg8和mem8

因为我们只知道eax,ebx edx ecx .. a,b,c,d寄存器可以使用q refer因为它们可以用低字节al dl cl访问...结合qm我们得到mem8。我的意思是记忆。这就是我的意思

答案 2 :(得分:-2)

哇我一开始很难过,但我搜索了一下,发现它是对处理器模型的引用。

我一直认为它适用于i7 Quadcore。

这是你从这里得到这些代码的地方吗?

它是变量语法的简单值指示器。