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函數,期望一切都按值傳遞。