RISC-V调用约定有两种:传统调用约定和新的整数调用约定(Integer Calling Convention)。 传统调用约定(C调用约定)是最早定义的调用约定,它将函数参数按顺序依次压入栈中,然后调用函数。函数返回时,返回值放在寄存器a0中。该调用约定适用于所有标准的RISC-V编译器和操作系统,是RISC-V生态系统中广泛采用的一种约定。 整
1 整数寄存器约定 RISCV中一共有32个整数寄存器。 1.1 特殊功能寄存器 x0 (zero):零寄存器,硬连线为0值,不可修改。用于提供常数0或清空操作。 x1 (ra):返回地址寄存器,存储函数调用的返回地址。 x2 (sp):堆栈指针,指向当前堆栈顶部。 x3 (gp)...
1 RISC-V ABI接口 ABI(Application Binary Interface)为应用程序二进制接口,它定义了应用程序之间或应用程序和操作系统之间进行二进制级交互时必须遵循的规则和约定。ABI包括了关于函数调用约定(参数传递,函数返回值等)、数据类型、对齐方式、字节序、 函数栈布局、系统调用等方面的规范。 具体来说,ABI定义了以下内容:...
假设我们在函数a中调用函数b,任何被函数a使用的并且是Caller Saved寄存器,调用函数b可能重写这些寄存器。 我认为一个比较好的例子就是Return address寄存器(注,保存的是函数返回的地址),你可以看到ra寄存器是Caller Saved,这一点很重要,它导致了当函数a调用函数b的时侯,b会重写Return address。 所以基本上来说,任何...
寄存器使用规则遵循调用约定:临时寄存器(如x5-x7、x28-x31)由调用者保存,保存寄存器(如x8-x9、x18-x27)由被调用者保存,x1-x31可存储任意数据,x0值恒为0且不可修改。 1. 寄存器组成判断: - RISC-V架构基础规范中明确包含32个通用整数寄存器(x0-x31),其中x0为不可修改的零寄存器,部分寄存器在ABI中定义...
我们将调用函数称为caller,被调用函数称为callee。 2.1 对比几种不同的寄存器保存方式 对比如下几种方式: 方式1:寄存器全部由caller 保存 方式2:寄存器全部由callee保存 方式3:按照程序调用约定,一部分寄存器由调用者保存(caller-saved), 一部分由被调用者保存(callee-saved) ...
RV32I 通用寄存器与函数调用约定 RV32I 基础指令集总共定义了 32 个 32 位的通用寄存器。它们分别被标记为 x0 ~ x31。其中零号寄存器 x0 是只读寄存器,其值永远为零。 RISC-V 的设计目标之一就是对 C/C++ 等高级语言提供硬件支持,并保持不同 处理器之间在 ABI 层面的相互兼容。RISC-V 的用户指令标准还...
esp c2 ble芯片模块上海乐鑫科技代理商RISC-V调用约定,调用约定规范函数时参数传递和函数返回结果的方式和数据类型。RISC-V gcc 编译器支持 ABI 调用约定。根据 ABI约定,RV32I 函数调用时使用a0~a7,共 8个通用寄存器传递参数,使用 ao 和al 两个通用存器返回函数结果。如果超过 8 个参数,则超出部分的参数通过栈...
二.RVG调用约定 a0-a7,fa0-fa7:用于函数传递参数,其中0-1用于返回值,a表示arguments。 都是调用者负责保存,因为是传参肯定是在函数调用前就要准备好,所部不可能是被调用者去负责保存。 如果函数参数为结构体的字段,每一个都是指针对齐的,则参数寄存器是结构体前面8个指针字pointer-words的影子shadow。