Assembly 函数堆栈框架

Assembly 函数堆栈框架,assembly,compiler-construction,callstack,calling-convention,stack-frame,Assembly,Compiler Construction,Callstack,Calling Convention,Stack Frame,据我所知,局部参数,一个过程的返回地址和其他内容被推送到内存中的堆栈上,但随后会弹出到CPU访问的各个寄存器中,因为寄存器数量有限,无法容纳具有大量参数或调用其他函数的叶过程 如果有一个很小的叶函数,它接受一些可以存储在本地寄存器中的参数,那么现代编译器还会生成代码来为函数创建堆栈框架吗?取决于体系结构和编译器的配置方式。请注意,在某些体系结构(如x86)上,返回地址通常不会保留在寄存器中,因为调用指令会将其直接放在堆栈上。良好的调用约定总是传递寄存器中的前几个参数,例如大多数RISC和所有x8

据我所知,局部参数,一个过程的返回地址和其他内容被推送到内存中的堆栈上,但随后会弹出到CPU访问的各个寄存器中,因为寄存器数量有限,无法容纳具有大量参数或调用其他函数的叶过程


如果有一个很小的叶函数,它接受一些可以存储在本地寄存器中的参数,那么现代编译器还会生成代码来为函数创建堆栈框架吗?

取决于体系结构和编译器的配置方式。请注意,在某些体系结构(如x86)上,返回地址通常不会保留在寄存器中,因为
调用
指令会将其直接放在堆栈上。良好的调用约定总是传递寄存器中的前几个参数,例如大多数RISC和所有x86-64调用约定。(假设它们适合,例如,不是按值计算的大型结构。)此外,函数通常不会弹出它们的堆栈参数(如果有),它们只是通过对调用堆栈的正常随机访问来加载它们。这样的问题通常可以通过自己的实验来回答……简短回答:没有优化(-O0),大多数编译器都会为堆栈帧生成代码。使用优化(-O3),除非必要,否则它们不会。理想情况下,一个微小的叶函数是内联的。这取决于体系结构和编译器的配置方式。请注意,在某些体系结构(如x86)上,返回地址通常不会保留在寄存器中,因为
调用
指令会将其直接放在堆栈上。良好的调用约定总是传递寄存器中的前几个参数,例如大多数RISC和所有x86-64调用约定。(假设它们适合,例如,不是按值计算的大型结构。)此外,函数通常不会弹出它们的堆栈参数(如果有),它们只是通过对调用堆栈的正常随机访问来加载它们。这样的问题通常可以通过自己的实验来回答……简短回答:没有优化(-O0),大多数编译器都会为堆栈帧生成代码。使用优化(-O3)时,除非必要,否则不会进行优化。理想情况下,内联一个很小的叶函数。