如何读取寄存器:RAX、RBX、RCX、RDX、RSP.RBP、RSI、C或C++中的RDI
How to read registers: RAX, RBX, RCX, RDX, RSP. RBP, RSI, RDI in C or C++?
假设我想从双核x64 CPU上的那些寄存器中读取值(几乎就是这样)。我该怎么做?我可以简单地写这样的东西吗:
uint64_t rax = 0, rbx = 0;
__asm__ __volatile__ (
/* read value from rbx into rbx */
"movq %%rdx, %0;n"
/* read value from rax into rax*/
"movq %%rax, %1;n"
/* output args */
: "=r" (rbx), "=r" (rax)
: /* no input */
/* clear both rdx and rax */
: "%rdx", "%rax"
);
然后只打印出rax
和rbx
?干杯
用gcc实现这一点的正确方法是使用寄存器约束:
uint64_t rax = 0, rbx = 0;
__asm__("" : "=a"(rax), "=b"(rbx) ::); /* make rax and rbx take on the current values in those registers */
请注意,您不需要任何实际的指令——约束告诉gcc,在不执行任何操作之后,值rax将在rax中,而rbx的值将在rbx中。
可以使用约束a
、b
、c
、d
、S
和D
(后两个用于%rsi和%rdi)。您也可以将Yz
用于%xmm0。不幸的是,似乎对其他特定寄存器没有限制。