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

Bri*_*own 5 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"
);
Run Code Online (Sandbox Code Playgroud)

然后只是打印出来rax和rbx?干杯

Chr*_*odd 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 */
Run Code Online (Sandbox Code Playgroud)

请注意,您不需要任何实际指令 - 约束告诉 gcc,在不执行任何操作后,值 rax 将位于 rax 中,而 rbx 的值将位于 rbx 中。

您可以使用约束a、b、c、d、S和D(后两个用于 %rsi 和 %rdi)。您也可以使用Yz%xmm0。不幸的是,其他特定寄存器似乎没有限制。