OS如何限制过程调用的方式?
How OS restricts the way of procedure call?
过程调用有两种方式,保存地址到寄存器或保存在栈中。我读到过程调用的方式是 OS 特定的。我想了解 OS 是如何限制它的。编译器不能生成将地址保存在寄存器中并稍后加载的代码,或者将其保存在堆栈中并在需要时弹出的代码吗?
这里只是想了解OS的作用。
谢谢。
操作系统没有任何功能,只是 OS 自己的库可能使用特定的调用 convention.The 编译器确定调用约定。它不是 OS 特定的,而是特定于语言和编译器的。
编程语言以不同的方式做事。例如,Ada 和 Pascal 的嵌套过程需要在幕后传递给它们的上下文,而在 C 和 C++ 中则不需要。
过去在这方面非常混乱。
到 1970 年代后期,VMS 操作系统定义了一个调用约定,供应商制作的所有编译器都遵守它。这就使得 Fortran 调用 Pascal 调用 C 调用 Fortran 成为可能。然而,即使在那里,事情也不是 100% 透明的。事实上,VMS 编译器对语言进行了扩展以调用其他语言的函数。在 FORTRAN 77 中,一切都通过引用传递。必须有扩展来调用 C 函数,该函数期望所有内容都按值传递。
过程调用有两种方式,保存地址到寄存器或保存在栈中。我读到过程调用的方式是 OS 特定的。我想了解 OS 是如何限制它的。编译器不能生成将地址保存在寄存器中并稍后加载的代码,或者将其保存在堆栈中并在需要时弹出的代码吗? 这里只是想了解OS的作用。
谢谢。
操作系统没有任何功能,只是 OS 自己的库可能使用特定的调用 convention.The 编译器确定调用约定。它不是 OS 特定的,而是特定于语言和编译器的。
编程语言以不同的方式做事。例如,Ada 和 Pascal 的嵌套过程需要在幕后传递给它们的上下文,而在 C 和 C++ 中则不需要。
过去在这方面非常混乱。
到 1970 年代后期,VMS 操作系统定义了一个调用约定,供应商制作的所有编译器都遵守它。这就使得 Fortran 调用 Pascal 调用 C 调用 Fortran 成为可能。然而,即使在那里,事情也不是 100% 透明的。事实上,VMS 编译器对语言进行了扩展以调用其他语言的函数。在 FORTRAN 77 中,一切都通过引用传递。必须有扩展来调用 C 函数,该函数期望所有内容都按值传递。