有关Stack Frame中有两个重要的寄存器,第一个是SP(Stack Pointer),它指向Stack的底部并代表了当前Stack Frame的位置。第二个是FP(Frame Pointer),它指向当前Stack Frame的顶部。因为Return address和指向前一个Stack Frame的的指针都在当前Stack Frame的固定位置,所以可以通过当前的FP寄存器寻址到这两个数据。 我们保...
堆栈是向下生长,并且要求128位(即16字节)对齐,这在 RISC-V ELF psABI specification 约定: The stack grows downwards and the stack pointer shall be aligned to a 128-bit boundary upon procedure entry. 为什么要求128位对齐?RISC-V在设计的时候已经在考虑128位系统,即RV128I,RV128I的通...
sp(stack pointer) Volatile Registers(CalleR Saved) 这些寄存器可以被CalleE自由的改变 如果calleR需要他们,他必须在程序调用之前把值存储起来 t0-t6(temporary registers) a0-a7(return address and arguments) ra(return address) 综上所述,寄存器就分为两种: ...
RISC-V MCU启动文件分析 启动文件由汇编语言编写,是MCU上电复位后第一个执行的程序。主要执行以下内容: 初始化gp(global pointer)全局指针寄存器、sp(stack pointer)栈指针寄存器 将data数据从flash中加载至RAM中 清空bss段数据 初始化中断向量表
x2 sp Stack pointer Caller x3 gp Global pointer -- x4 tp Thread pointer -- x5-7 t0-2 Temporaries Caller x8 s0/fp Saved register/frame pointer Caller x9 s1 Save register Caller x10-11 a0-1 Function arguments/return values Caller
RISC-V有x0~x31共32个通用寄存器,每个通用寄存器都有各自的用途,例如x2是作为sp栈指针、a0~a1用来保存函数参数或返回值。x0寄存器被硬编码为了0,就是个0值寄存器。 ABI名称相当于这些通用寄存器的别名,在RISC-V汇编当中,都使用ABI名称来代表这些寄存器。
第3行,定义__stack_size变量,并将其赋值为8K。 第5行,定义.init输出段。 第7行,.init段里包含.init输入段。*号是通配符,KEEP的作用是告诉链接器保留这些输入段,不要优化掉。.init段在start.S文件中定义,从这里可以知道,启动代码放在了flash里的0x00000000地址处。这也知道tinyriscv的程序是从0x0地址开始运行...
指令就是我们交代CPU 要执行的操作,指令集就可以简单理解为指令的集合。我们把cpu 能够识别的指令汇总在一起就构成了一个指令集。 不同的CPU 有不同的指令集,根据他们的繁简程度可以分为两种:复杂指令集CISC 和精简指令集 RISC 1.2 指令集架构 指令架构(Instruction Set Architecture, 缩写为ISA),是软件和硬件的...
初始化gp(global pointer)全局指针寄存器、sp(stack pointer)栈指针寄存器 将data数据从flash中加载至RAM中 清空bss段数据 初始化中断向量表 配置系统时钟 从Machine模式切换到User模式,进入main函数运行 CH32V103启动文件如下: /*** (C) COPYRIGHT *** * File Name : startup_ch32v10x.s * Author WCH ...
在 RISC-v中,栈指针( stack pointer)是寄存器×2,也称为sp。将数据放入栈中称为压栈,从栈中移除数据称为 弹栈。栈按照 从高到低的地址顺序“增长”,通过减栈指针将值压栈;通过增加栈指针缩小栈,从而弹出栈中的值。 3. 栈和新数据分配 栈也用于存储过程的局部变量,但这些变量不适用于寄存器,例如局部数组...