首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何读取寄存器: RAX、RBX、RCX、RDX、RSP。RBP、RSI、RDI是C语言还是C++语言?

如何读取寄存器: RAX、RBX、RCX、RDX、RSP。RBP、RSI、RDI是C语言还是C++语言?
EN

Stack Overflow用户
提问于 2013-12-14 04:49:17
回答 1查看 5.5K关注 0票数 5

假设我想要在双核x64上从这些寄存器中读取值(差不多都是这样)。我该怎么做呢?我能不能简单地写成这样:

代码语言:javascript
运行
复制
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?干杯

EN

回答 1

Stack Overflow用户

发布于 2013-12-14 06:15:59

对gcc来说,正确的方法是使用寄存器约束:

代码语言:javascript
运行
复制
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)。您还可以对%xmm0使用Yz。不幸的是,似乎没有对其他特定寄存器的约束。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20575739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档