我正在熟悉PCASM的书,但我不明白一件事(这可能只是我的误解,我仍然是低级编程的新手)。据说 c 调用约定是这样的
- 将参数推送到堆栈上
- 使用
call
指令调用子例程,该子例程将在堆栈上推送返回地址 - 请参阅向
ESP
添加常量偏移量的参数 - 完成后调用
ret
,这将弹出返回地址(然后根据需要选择弹出参数)并使用它来跳回到调用代码
到目前为止一切顺利,但示例表明返回代码只是堆栈上的四个字节。这允许跳转到当前代码段的任何地方,但是如果子例程必须返回到另一个段怎么办?如果代码段必须以与返回地址相同的方式推送到堆栈上,那么应该如何引用子例程中的参数(因为它们在近返回和远返回时具有不同的偏移量)?
retf
指令执行"长回波",其中包括段和偏移量。