我知道调用堆栈在Linux IA32中具有明确定义的操作方式。调用堆栈的操作方式可能会从体系结构更改为另一种体系结构。但这还取决于编程语言和操作系统吗?
首选的CPU级调用堆栈取决于体系结构。从历史上看,CPU的指令支持堆栈增长到较低或较高的内存地址,并且堆栈的内容随体系结构和编程语言而变化。
被编译为机器代码的编程语言可能会使用CPU支持的调用堆栈。但是任何给定的编程语言都可以选择使用哪个堆栈,如何使用它,在其中放置什么,甚至从堆栈中弹出哪个上下文("calling convention")。
"Call Stack"的Wikipedia文章解释了大多数调用堆栈包含的内容以及如何使用它们。
操作系统将适应CPU体系结构通过编写它们的编程语言。用汇编语言编写的OS部件可能会使用该体系结构的约定。
调用堆栈的内容可能因语言而异。例如,某些语言按从右到左的顺序推送参数,而其他语言则按从右到左的顺序推送参数。一些依赖于调用者在返回时清理堆栈,而另一些依赖于被调用者来完成它。
例如,考虑不同的x86 calling conventions。