C 堆栈中使用空闲寄存器的顺序

C 堆栈中使用空闲寄存器的顺序,c,gcc,assembly,C,Gcc,Assembly,假设我的程序调用函数: void f(int arr[], int size) { int i, j, k; // other code } 编译器(gcc)使用调用方保存寄存器的顺序是什么:%eax,%ecx,%edx 在这种情况下,它还会使用一个被叫存储寄存器:%ebx、%esi、%edi吗?实际上不必这样做。事实上,通用寄存器不必保留,如果使用它们而不是堆栈帧,这只是因为优化。唯一的方法是尝试并查看。(使用-s选项输出汇编代码)谢谢,我已经尝试了-s标志,但我并不真正理解整个输出

假设我的程序调用函数:

void f(int arr[], int size)
{
  int i, j, k;
  // other code
}
编译器(gcc)使用调用方保存寄存器的顺序是什么:%eax,%ecx,%edx


在这种情况下,它还会使用一个被叫存储寄存器:%ebx、%esi、%edi吗?

实际上不必这样做。事实上,通用寄存器不必保留,如果使用它们而不是堆栈帧,这只是因为优化。唯一的方法是尝试并查看。(使用
-s
选项输出汇编代码)谢谢,我已经尝试了-s标志,但我并不真正理解整个输出。关于优化,如果我使用-o,我知道编译器可以使用4个寄存器,那么它使用它们的顺序是什么,首先是参数还是本地变量?您是否尝试在internet搜索引擎中键入“gcc调用约定”?似乎可以回答您的所有问题。编译器不需要以任何特定顺序(或根本不需要)使用寄存器。GCC不以可预测的顺序使用寄存器,变量到寄存器的映射通常不是1:1。一个变量在其生命周期内可能存在于不同的寄存器中,而同一个寄存器可能用于许多不同的变量。