首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能保存rip的值?

为什么我不能保存rip的值?
EN

Stack Overflow用户
提问于 2012-09-13 07:32:01
回答 2查看 6.1K关注 0票数 7
代码语言:javascript
复制
#include <stdint.h>
uint64_t rip;
int main()
{
    asm(
        "movq %%rip, %0\n" : "=m" (rip)
        );

    sleep(10);
}

当我编译时,我得到

代码语言:javascript
复制
cc -m64    rip.c   -o rip
/tmp/ccwNbZi1.s: Assembler messages:
/tmp/ccwNbZi1.s:12: Error: suffix or operands invalid for `movq'
make: *** [rip] Error 1
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-13 07:57:37

您不能读取(E|R)IP,因为没有直接读取它的x86(/64)指令。

“读取”它的唯一方法是使用CALL指令进行调用。它将把返回地址保存在堆栈上,你可以读取的那个地址。

更新:在64位模式下,您可以利用RIP-relative寻址,因此LEA RAX, [RIP]将在RAX中为您提供其自身的地址。另一种解决方法是在组件中使用MOV RAX, $

票数 19
EN

Stack Overflow用户

发布于 2018-02-22 16:14:48

我能想到的在x86_64下获取/设置%rip的唯一方法就是使用ptrace()。下面是从ltrace的源代码中复制过来的。

代码语言:javascript
复制
void* addr = ptrace(PTRACE_PEEKUSER, pid, (8 * RIP), 0);
ptrace(PTRACE_POKEUSER, pid, (8 * RIP), addr);

其中,RIP是在/usr/include/sys/reg.h中定义的宏

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

https://stackoverflow.com/questions/12397451

复制
相关文章

相似问题

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