2017-05-07 59 views
0

我熟悉PCASM这本书,我不明白一件事(这可能只是我的误解,我还是低级编程的新手)。据告知,C调用约定是一样的东西x86 ASM:如何返回到不同的代码段实现?

  • 推参数入栈
  • 使用call指令调用子程序,其中,除其他事项外,将在堆栈
  • 推寄信人地址是指参数添加不断偏移ESP
  • 通话ret当你做这将弹出返回地址(然后任选弹出的参数,如果你愿意的话),并用它跳转回调用代码

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

回答

2

retf指令执行包含段和偏移的“长期返回”。

+0

在不太可能的情况下,我会在ASM中写入几乎可以在任何地方使用的东西(每当我不确定返回的代码是否在同一个段中)时,我应该只使用'retf'默认值? – Etki

+0

绝对不是。它只能在通过伴随的“长时间通话”调用该功能时使用。推送/弹出的字节数是不同的。 –

+2

@Etki您正在通过您链接的文档进行保护模式(PM)编程。您永远不需要进行远程调用/返回,因为没有任何操作系统执行过多个公共用户模式代码段 - 您不应该更改段。所有操作系统都实现了平面模型,其中一个段覆盖了所有32位地址空间 - 无需其他段(通过分页实现隔离)。如果他们需要特权间转移,并且只有特权较低的细分受众群才有可能获得更多的远期回报。英特尔手册涵盖了所有这些。 –