我正在开发一个使用内联汇编执行长跳转的程序。据我所知,我需要做的就是将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一直在使用跳转,但我通常会遇到分段错误。
任何意见都会受到赞赏。
答案 0 :(得分:1)
如果您希望代码在某个预定义的地址上继续,您可以在asm代码(伪代码)中执行此操作:
push myNewAddress
ret
或者如果您更喜欢它,请使用寄存器:
mov eax, myNewAddress
jmp eax
您不能直接使用指令修改PC,因为它总是在当前指令的位置。但是,您应该知道这可能会导致内存泄漏或其他副作用,因为堆栈可能无法正确处理。