x86 ASM:如何实现返回到不同的代码段?



我正在熟悉PCASM的书,但我不明白一件事(这可能只是我的误解,我仍然是低级编程的新手)。据说 c 调用约定是这样的

  • 将参数推送到堆栈上
  • 使用call指令调用子例程,该子例程将在堆栈上推送返回地址
  • 请参阅向ESP添加常量偏移量的参数
  • 完成后调用ret,这将弹出返回地址(然后根据需要选择弹出参数)并使用它来跳回到调用代码

到目前为止一切顺利,但示例表明返回代码只是堆栈上的四个字节。这允许跳转到当前代码段的任何地方,但是如果子例程必须返回到另一个段怎么办?如果代码段必须以与返回地址相同的方式推送到堆栈上,那么应该如何引用子例程中的参数(因为它们在近返回和远返回时具有不同的偏移量)?

retf指令执行"长回波",其中包括段和偏移量。

最新更新