c++ - 如何读取寄存器 0x​​104567911 RBX、RCX、RDX、RSP。 C 或 C++ 中的 RBP、RSI、RDI?

标签 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"
);

然后打印出 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 中。

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

关于c++ - 如何读取寄存器 0x​​104567911 RBX、RCX、RDX、RSP。 C 或 C++ 中的 RBP、RSI、RDI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20575739/

相关文章:

c++ - 将方法作为模板参数传递 C++11

c++ - 如何修改 vtkPolydata 中单元格中的点?

c++ - 结构的 cudaMalloc 和相同结构的元素

c - 我应该如何验证从 argv 传入的整数值不会溢出?

gcc - 关于 ARM 内联装配的不同 clobber 描述的混淆

c++ - 内联汇编 GCD 不起作用

c++ - 删除定时器-队列定时器

C - 将 int 从十六进制转换为十进制?

使用相同的输入多次调用一个函数但得到不同的返回值

rust - `push label` 推送 [label],而不是标签的地址(Rust asm!)