This question already has answers here:
Reading program counter directly

(7个答案)


3年前关闭。



#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

最佳答案

您无法读取(E|R)IP,因为没有x86(/64)指令可以直接读取它。
“读取”的唯一方法是使用CALL指令进行调用。它将返回地址保存在堆栈中,您可以读取该地址。
更新:在64位模式下,您可以利用RIP相对寻址,因此LEA RAX, [RIP]将在RAX中提供其自身的地址。另一个解决方法是在汇编中使用MOV RAX, $

关于assembly - 为什么我不能保存rip的值(value)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12397451/

10-11 07:08