0

过程调用有两种方式,保存地址进行注册或将其保存在堆栈中。我读过程序调用的方式是特定于操作系统的。我想了解OS如何限制这一点。编译器无法生成将地址保存在寄存器中并稍后加载的代码,或者将其保存在堆栈中并在需要时弹出它? 只是想了解操作系统在这里的作用。操作系统如何限制过程调用的方式?

谢谢。

+1

其实它是ABI特定的。操作系统通常采用应用程序二进制接口(它也标识调用者/被调用者保存寄存器以及如何传递参数和返回值)以允许通过编译单元(例如,使用共享库)进行调用。编译器可以选择忽略内部调用的ABI(使用编译器甚至可以避免一些寄存器保存操作的调用者/被调用者的知识),但编译器通常只对所有调用采用ABI。由于被叫方需要使用返回地址返回给主叫方,被叫方需要知道它在哪里。 –

+0

我得到了需要的东西。谢谢! – user1289

回答

1

操作系统没有任何功能,除了操作系统自己的库可能使用特定的调用约定。编译器确定调用约定。它'不是特定于操作系统的,而是特定于语言和编译器

编程语言以不同的方式做事。例如,Ada和Pascal的嵌套过程需要在C和C++中不需要的场景后传递给它们的上下文。

在过去的日子里,这里非常混乱。

到了20世纪70年代后期,VMS操作系统定义了一个调用约定,供应商编写的所有编译器都符合它。这使得Fortran能够致电Pascal致电C致电Fortran。然而,即使在那里,事情并非100%透明。事实上,VMS编译器扩展了语言以调用其他语言的函数。在FORTRAN 77中,所有内容均通过参考传递。需要扩展来调用C函数,期望一切都按值传递。