This question already has answers here:
Reading program counter directly
(7个答案)
3年前关闭。
当我编译时我得到
(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