This question already has an answer here:
How can you pull a value from a register?

(1个答案)


7年前关闭。




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

10-04 17:21