假设我想要在双核x64上从这些寄存器中读取值(差不多都是这样)。我该怎么做呢?我能不能简单地写成这样:
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
?干杯
发布于 2013-12-14 06:15:59
对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)。您还可以对%xmm0使用Yz
。不幸的是,似乎没有对其他特定寄存器的约束。
https://stackoverflow.com/questions/20575739
复制相似问题