7
#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
4

2 に答える 2

19

(E|R)IP直接読み取る x86(/64) 命令がないため、読み取ることができません。

それを「読み取る」唯一の方法は、CALL命令で呼び出しを行うことです。リターンアドレスをスタックに保存し、それを読み取ることができます。

更新: 64 ビット モードでは、RIP-relative アドレッシングを利用できるためLEA RAX, [RIP]RAX. さらに別の回避策はMOV RAX, $アセンブリにあります。

于 2012-09-12T23:57:36.670 に答える