如何读取寄存器:RAX,RBX,RCX,RDX,RSP。 C或C ++中的RBP,RSI,RDI?

时间:2013-12-13 20:49:17

标签: c++ c inline-assembly

让我们说我想在双核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"
);

然后打印出raxrbx?干杯

1 个答案:

答案 0 :(得分:4)

使用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中。

您可以使用约束abcdSD(后两者适用于%rsi和%rdi)。您还可以将Yz用于%xmm0。不幸的是,似乎没有其他特定寄存器的限制。