假设我想创建一个接收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。
我知道它不起作用,但我希望它能澄清我想要实现的目标。
有什么建议吗?
答案 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位)。最后,虽然这可以作为一个宏,但我怀疑这将作为一个实际的功能(除了可能是一个强制内容)。