【发布时间】:2012-08-03 20:30:44
【问题描述】:
我一直在尝试使用英特尔调试寄存器,但我似乎做错了什么。我创建了一个非常简单的 Linux LKM 并尝试使用内联汇编来执行寄存器的琐碎操作。例如:
__asm__ ("movl %eax, %db0");
我收到的错误消息表明我在做一些根本不正确的事情。例如:
Error: unsupported for `mov'
有人对如何使用这些寄存器有任何见解吗?
【问题讨论】:
-
这适用于 x86 还是 x86-64 系统?如果是 64 位,则需要从 64 位寄存器 (
rax) 移动。否则,请删除该标签以防止混淆。 -
这适用于 x86-64 (rax) 和 x86 (eax)。这只是一个例子,我也尝试过自己对各种调试寄存器进行异或运算。选择这些标签是因为我将它们与低级主题相关联。
-
Xoring 永远不会起作用,因为调试寄存器只能通过
mov指令访问。问题是调试寄存器是drN,而不是dbN。在直接查看文档时,我几乎错过了这一点。 -
@ughoavgfhw,是的,寄存器是 DRN,但
as允许使用dbN作为它们的名称,如manual 所示。在我的 32 位 OpenSUSE 12.1 机器上,GNU As 2.21.1 接受drN和dbN作为这些寄存器的名称。
标签: gcc linux-kernel x86 x86-64