ABI包括了关于函数调用约定(参数传递,函数返回值等)、数据类型、对齐方式、字节序、 函数栈布局、系统调用等方面的规范。 具体来说,ABI定义了以下内容: 数据类型、对齐方式和字节序; 寄存器使用约定:哪些寄存器用于传递函数参数、返回值和保存临时变量; 函数调用约定:函数调用的具体步骤,包括参数传递、返回值处理等; ...
jr ra # 跳转到返回地址 ra(函数返回) 在调用函数f前,先做了一步将函数f的两个参数放入寄存器a1,a0中。这是因为寄存器a1,a0是调用者保存寄存器(a调用b的话,由a函数来管理调用者保存寄存器的内容) 调用函数f时,将保存着函数参数的a1,a0寄存器压入栈中。 这时我们可以发现,当一个参数寄存器(形式为ax)保存一...
函数调用过程通常分为 6 个阶段[Patterson and Hennessy 2017]。 将参数存储到被调用的函数可以访问到的位置; 跳转到函数起始位置; 获取函数需要的局部存储资源,按需保存寄存器(callee saved registers) ; 执行函数中的指令; 将返回值存储到调用者能够访问到的位置,恢复寄存器(callee saved registers),释放局部...
这里的意思是,一个Caller Saved寄存器可能被其他函数重写。 假设我们在函数a中调用函数b,任何被函数a使用的并且是Caller Saved寄存器,调用函数b可能重写这些寄存器。 我认为一个比较好的例子就是Return address寄存器(注,保存的是函数返回的地址),你可以看到ra寄存器是Caller Saved,这一点很重要,它导致了当函数a调用函...
1. 将参数存储到函数能够访问到的位置; 2. 跳转到函数开始位置(使用 RV32I 的 jal 指令); 3. 获取函数需要的局部存储资源,按需保存寄存器; 4. 执行函数中的指令; 5. 将返回值存储到调用者能够访问到的位置,恢复寄存器,释放局部存储资源; 6. 返回调用函数的位置(使用 ret 指令)。 为了获得良好的性能,变量...
2.5.3abspath函数 文件绝对路径函数,用法如下: path := $(abspath main.c) 作用是获取当前目录下main.c文件的绝对路径(含文件名,结果比如:/work/main.c),然后赋值给path变量。 Makefile的内容就介绍到这里,下面以tinyriscv项目里的tests/example/simple例程来具体分析。
这个调用是异步的,更具体的,这个函数会在目标 hart 开始执行前返回,SBI 实现能够保证返回码的准确性。如果 SBI 实现是一个执行在 M 模式下的平台运行时固件,那么它必须在将控制权交给 S 模式前,配置 PMP 以及其他 M 模式下的状态。 hartid 参数指定了待启动的目标 hart; ...
最基础的指令是RV32I,即32位的指令。这个是所有的RISC-V处理器都需要实现的指令。RISC-V体系结构可以...
.type伪操作用于定义符号的类型。譬如“.type symbol,@function”即将名为symbol的符号定义为一个函数(function)。 .align integer .align伪操作用于将当前PC地址推进到“2的integer次方个字节”对齐的位置。譬如“.align 3”即表示将当前PC地址推进到8个字节对齐的位置处。