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

时间:2012-09-12 23:32:01

标签: assembly x86

#include <stdint.h>
uint64_t rip;
int main()
{
    asm(
        "movq %%rip, %0\n" : "=m" (rip)
        );

    sleep(10);
}

当我编译时,我得到了

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

2 个答案:

答案 0 :(得分:12)

您无法阅读(E|R)IP,因为没有x86(/ 64)指令可以直接阅读。

阅读&#34;的唯一方法它是用CALL指令进行调用的。它将保存堆栈上的返回地址和您可以读取的地址。

更新:在64位模式下,您可以利用RIP - 相对地址,因此LEA RAX, [RIP]会在EAX中为您提供自己的地址。另一种解决方法是在装配中MOV RAX, $

答案 1 :(得分:-1)

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

void* addr = ptrace(PTRACE_PEEKUSER, pid, (8 * RIP), 0);
ptrace(PTRACE_POKEUSER, pid, (8 * RIP), addr);

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