在定义引号中使用变量

时间:2014-10-02 08:12:10

标签: c

假设我想创建一个接收DR(调试寄存器)id号的函数,并返回相应DR寄存器的值。

类似于(DR0的示例):

uint64_t readdr(uint8_t id)
{
   uint64_t result;
   asm volatile("movq %%dr0, %%rax\n" : "=a" (result));
   return result;
}

此示例仅读取DR0寄存器并返回结果。 我希望这个功能适用于所有DR,所以我需要这样的东西:

#define read_dr(x, result) "movq %%dr(x), %%rax\n" : "=a" (result)"

然后我将能够做到这样的事情:

asm volatile(read_dr(id, result))

所以它适用于所有给定的DR ID。

我知道它不起作用,但我希望它能澄清我想要实现的目标。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

答案取决于编译时是否知道id。例如:

#include <stdio.h>

#define read_dr(id, result) \
   __asm__ ( \
      "movq %%dr%c1, %0" \
      : "=r" (result) \
      : "i" (id) \
      : "cc")

int main(int argc, char *argv[])
{
   long long a;
   read_dr(1, a);
   printf("%lld\n", a);
}

如果编译器无法在任何时候将id解析为常量,则会出现编译错误(不可能出现约束)。

请注意,读取调试寄存器是一种特权指令。此外,这是64位代码(稍微更漂亮的版本适用于32位和64位)。最后,虽然这可以作为一个宏,但我怀疑这将作为一个实际的功能(除了可能是一个强制内容)。