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

让我们说我想在双核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 ? 干杯

使用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。 不幸的是,似乎没有其他特定寄存器的限制。