【问题标题】:x86 ASM: how return to different code segment is implemented?x86 ASM:如何实现返回不同的代码段?
【发布时间】:2017-05-07 17:26:16
【问题描述】:

我熟悉PCASM 的书,但我不明白一件事(这可能只是我的误解,我对低级编程还是新手)。据说c调用约定类似于

  • 将参数推入堆栈
  • 使用call 指令调用子程序,其中包括将返回地址压入堆栈
  • 请参阅将常量偏移量添加到ESP 的参数
  • 完成后调用ret,它将弹出返回地址(如果您愿意,还可以选择弹出参数)并使用它跳转回调用代码

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

【问题讨论】:

    标签: assembly x86


    【解决方案1】:

    retf 指令执行“长返回”,其中包括段和偏移量。

    【讨论】:

    • 在不太可能的情况下,我将在 ASM 中编写几乎可以在任何地方使用的东西(只要我不确定返回的代码是否在同一段中),我应该只使用 retf默认情况下?
    • 绝对不是。它只能在通过伴随的“长调用”调用函数时使用。推送/弹出的字节数不同。
    • @Etki 根据您链接的文档判断,您正在以保护模式 (PM) 进行编程。您永远不需要进行远调用/返回,因为没有操作系统曾经实现过一个以上的公共用户模式代码段 - 您不应该更改段。所有操作系统都实现了平面模型,其中单个段覆盖所有 32 位地址空间 - 不需要其他段(通过分页实现隔离)。如果它们需要特权间转移并且只可能对特权较低的段进行,则更远的回报在 PM 中涉及更多。英特尔手册涵盖了所有这些内容。
    • 感谢@MargaretBloom,您为我的简洁回答添加了很多有用的信息。
    • @JonathonReinhart 谢谢你,我在改变我的心智模型时遇到了麻烦
    猜你喜欢
    • 1970-01-01
    • 2011-09-13
    • 2018-02-21
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多