获取x86当前指令的地址
我使用的是 x86 的 Linux(准确地说是 64 位)。有没有办法获取当前指令的地址。实际上我想编写自己的简化版本的setjmp/longjmp。 在这里,R..发布了longjmp的简化版本。知道如何实现 setjmp 吗?一个简化的版本,即不考虑异常和信号等......
I am using Linux with x86 (64 bit to be precise). Is there a way I can get the address of the current instruction. Actually I want to write my own simplified versions of setjmp/longjmp. Here, R.. posted a simplified version of longjmp. Any idea how setjmp is implemented. A simplified version that is, without taking into account of exceptions and signals etc...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我相信在 64 位代码中,您可以简单地执行
lea rax, [rip]
。32 位习惯用法是:
I believe in 64-bit code you can simply do
lea rax, [rip]
.The 32-bit idiom is:
如果使用 GCC,您还可以使用
__builtin_return_address
If using GCC, you could also use
__builtin_return_address
当前段偏移寄存器 (
EIP
) 通常不可访问。然而,有一种间接读取它的黑客方法 - 你欺骗程序将 EIP 的值压入堆栈,然后将其读取。您可以创建一个如下所示的子例程:或者,甚至更简单:
如果您使用
CALL FAR
指令,则段值(CS
)将被推送到堆栈上,如下所示出色地。如果您使用的是 C,则可以在此页面上使用各种特定于编译器的 C 扩展。另请参阅这篇有趣的文章。
The offset-into-the-current-segment register (
EIP
) is not normally accessible. However, there is a hackish-way to read it indirectly - you trick the program into pushing the value of EIP onto the stack, then just read it off. You could create a subroutine that looks like this:Or, even simpler:
If you use a
CALL FAR
instruction, the segment value (CS
) will be pushed on the stack as well.If you're using C, there are various compiler-specific C-extensions you could use on this page. See also this interesting article.
这个站点提供了setjmp和longjmp的简单版本,即如下。
This site gives a simple version of setjmp and longjmp, which is as follows.