如何读取寄存器: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++?

本文关键字:RBP RSP RSI RDX RDI 中的 C++ RCX RBX 何读取 读取      更新时间:2023-10-16

假设我想从双核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。不幸的是,似乎对其他特定寄存器没有限制。