This question already has an answer here:
How can you pull a value from a register?
(1个答案)
7年前关闭。
可以说,我想从双核x64 CPU上的那些寄存器中读取值(几乎就是这样)。我怎样才能做到这一点?我可以简单地写一些像这样的东西吗:
然后只打印出
请注意,您不需要任何实际的指令-约束告诉gcc,不执行任何操作之后,rax的值将为rax,而rbx的值将为rbx。
您可以使用约束
(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"
);
然后只打印出
rax
和rbx
吗?干杯 最佳答案
使用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。
您可以使用约束
a
,b
,c
,d
,S
和D
(后两个用于%rsi和%rdi)。您也可以将Yz
用于%xmm0。不幸的是,其他特定寄存器似乎没有限制。10-04 17:21