【发布时间】:2014-03-05 07:19:24
【问题描述】:
我正在开发一个使用内联汇编执行长跳转的程序。据我了解,我需要做的就是将 FP 和 PC 替换为保存的 FP 和 PC。使用程序集,我可以更改帧指针 (%ebp),但我无法在 PC 上执行此操作。
int jump(int x)
{
int oldFP = getebp(); //the FP of the calling function
int oldPC = getebp()+4; //the PC of the calling function
ljump(); //uses assembly to change FP (works) but can't figure out PC
return x;
}
而我的ljump() 是
ljump: # return stack frame pointer FP
movl savedFP, %ebp
ret
我之前尝试更换 PC 一直在使用跳转,但是我通常会遇到分段错误。
我们将不胜感激。
【问题讨论】:
-
不确定答案是什么,但您可以研究一下
setjmp和longjmp是如何为您的平台实现的,并尝试类似的方法。 -
不要尝试重新实现
longjmp,只需使用longjmp。非本地转移比看起来更难。最好让运行时库为您完成。它了解非本地传输的各种 ABI 要求。 (在 x86 上,您还需要恢复非易失性寄存器。) -
感谢您的建议。我查看了 longjmp 的源代码,但很难阅读它。更改帧指针很容易并且有效,但事实证明更改 PC 更加困难
标签: c assembly program-counter