函数调用约定(LoongArch体系)

一、调用约定

函数调用约定是指在不同的编译器中,函数调用时,都会有一套怎样给被调函数传递参数以及怎样从被调函数中返回结果值的约定。这套约定的背后,遵循的原则是:将参数和返回值要么放在栈上,要么放在寄存器和栈的组合上。现代处理器体系结构基本上都是采用寄存器和栈的组合,即给定数目的寄存器用于存放栈和返回值,当寄存器的数目不够用时,再将多出来的参数放在栈上面。

要注意的是,调用约定并不是编程语言本身规定的内容,而是与实现编程语言的编译器相关的,不同的编译器对函数调用的实现可能是不同的,包括如何传递参数和返回结果,以及如何清理栈,等等,具体该如何定义,还需要结合目标机器的体系结构,做合理高效的定义。

二、整型调用规范

1)参数传递既有标量类型也有复合类型,首先要区分:

  • 标量类型:算术类型和指针类型统称为标量类型,且一份标量类型的数据只能包含一个值。如:整数类型(int、short、long等)、字符类型(char、wchar_t等)、枚举类型(enum)、浮点类型(float、double等)、布尔类型(bool)以及指针类型(char*)都属于标量类型。
  • 复合类型:一份复合类型的数据可以包含多个标量类型的值,也可以包含其他复合类型的值。如:结构体(struct)、数组、字符串都属于复合类型,注意字符串作为参数时的传递,有字符数组和指针两种方式,注意区分。

2)基本整型调用规范提供了8个参数寄存器$a0-$a7用于参数传递,前两个参数寄存器$a0$a1也用于返回值。

3)若传递的参数宽度不超过XLEN位(寄存器宽度),则在寄存器中传递,若没有可用的寄存器,则在栈上传递,复合类型在栈上传递时字段布局同内存中一致。

4)若传递的参数宽度大于XLEN位,不大于2*XLEN位,

三、浮点调用规范

猜你喜欢

转载自blog.csdn.net/qq_42570601/article/details/121424251