获取x86的当前指令的地址

Met*_*est 11 c linux 64-bit x86 assembly

我使用Linux与x86(准确地说是64位).有没有办法可以得到当前指令的地址.其实我想写自己的简化版本的setjmp/longjmp.在这里,R ..发布了longjmp的简化版本.知道如何实现setjmp.一个简化的版本,没有考虑异常和信号等...

NPE*_*NPE 26

我相信你可以简单地使用64位代码lea rax, [rip].

32位成语是:

      call next
next: pop eax
Run Code Online (Sandbox Code Playgroud)

  • 程序集中的另一个选项是'mov(r | e)ax,$`或`mylabel:mov(r | e)ax,offset mylabel`. (2认同)

Bas*_*tch 10

如果使用GCC,您也可以使用 __builtin_return_address

  • 如果使用GCC,它更容易使用[`somelabel:return && somelabel;`](http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html) (3认同)
  • 请记住,您需要将其包装在函数中以获得预期的效果,否则您将最终得到当前堆栈帧的返回地址而不是当前指令的地址. (2认同)

Blu*_*eft 6

偏移到当前段寄存器(EIP)通常不可访问.然而,间接读取它有一种hackish方式 - 你欺骗程序将EIP的值推入堆栈,然后只是读取它.您可以创建一个如下所示的子例程:

GetAddress:
    mov eax, [esp]
    ret
...
    call GetAddress     ; address of this line stored in eax
Run Code Online (Sandbox Code Playgroud)

或者,甚至更简单:

    call NextLine
NextLine:
    pop eax             ; address of previous line stored in EAX
Run Code Online (Sandbox Code Playgroud)

如果使用CALL FAR指令,则段值(CS)也将被推入堆栈.


如果您使用的是C,那么您可以在此页面上使用各种特定于编译器的C扩展.另见这篇有趣的文章.