如何获取堆栈指针和返回地址并将它们恢复到之前的状态

问题描述 投票:0回答:1

我正在尝试为用 C 编写的程序实现一个穷人的 call with current continuation 。我可以“轻松”访问并 memcpy C 堆栈的相关部分(显然,这不可移植并且充满了 UB,但我已经咬住了那颗子弹)。

我想知道如何获取实际的堆栈指针和返回地址以及如何恢复它们。 我的印象是,我可能可以只对堆栈指针执行此操作(返回地址本身有望隐藏在我复制和恢复的堆栈块内)。

我怀疑这需要一些组装,但我希望最好有一些聪明的方法来避免它。

c stack-pointer callcc
1个回答
0
投票

根据请求,我以答案的形式发表评论(不过,你正在做一些非常具体的事情,我怀疑任何有同样问题的人都会阅读它:D)

这可能可以通过

setjmp/longjmp
来完成(当然,以不可移植的方式)。我的意思是,它与
call/cc
几乎是一样的,但是(而且是一个很大的但是)事实上,你只能向下堆栈。所以,你可以回到呼叫者那里,或者呼叫者的呼叫者那里,或者……;但与
call/cc
相反,“返回”到先前调用的函数,在像 Marty McFly 的时间线一样非线性的堆栈中。带有
setjmp
的堆栈仍然是相同的经典、线性堆栈,只是您可以快速取消堆栈。它不是“stack”与call/cc的隐式树

但是,

setjmp
仍然存储了您需要的所有内容(堆栈指针、寄存器等)。如果与过时的堆栈一起使用,它是 UB,但可能会将其与您打算做的丑陋的堆栈副本结合起来......

© www.soinside.com 2019 - 2024. All rights reserved.