将程序计数器(PC)修改为已保存的地址

时间:2014-02-07 18:32:03

标签: c assembly program-counter

我正在开发一个使用内联汇编执行长跳转的程序。据我所知,我需要做的就是将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一直在使用跳转,但我通常会遇到分段错误。

任何意见都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

如果您希望代码在某个预定义的地址上继续,您可以在asm代码(伪代码)中执行此操作:

push myNewAddress
ret

或者如果您更喜欢它,请使用寄存器:

mov  eax, myNewAddress
jmp eax

您不能直接使用指令修改PC,因为它总是在当前指令的位置。但是,您应该知道这可能会导致内存泄漏或其他副作用,因为堆栈可能无法正确处理。