首页 > 编程语言 >一起学RISC-V汇编第9讲之RISC-V ABI之栈帧

一起学RISC-V汇编第9讲之RISC-V ABI之栈帧

时间:2024-10-07 19:22:17浏览次数:8  
标签:函数 int ABI 之栈 RISC 函数调用 寄存器 指针

这一节讲解RISC-V中的栈帧。

1 C语言中的{}的秘密

函数执行的底层其实是操作寄存器,CPU的寄存器是有限的,为什么我们进行一系列函数调用后还能正确运行,这些函数之间是怎么协调使用寄存器的?

答案是:

函数之间能随意调用,还能顺利恢复现场,这个就是栈的功劳。为什么我们在代码中并没有操作栈呢?其实这一切都是编译器帮我们完成的,为程序员屏蔽了比较复杂的栈操作,比如C语言函数中的大括号{},我们可以粗暴的认为:{ 是入栈操作,} 是出栈操作,这样为程序员屏蔽了比较复杂的栈操作。

如下伪代码表示A函数调用B函数,B函数调用C函数。

function C()
{
    xxxxx;
}

function B()
{
    C();
}

function A()
{
    B();
}

其栈帧结构下图,下图来自于《循序渐进,学习开发一个 RISC-V 上的操作系统》相关章节。其过程如下:

调用函数A时,创建函数A的栈帧

函数A调用函数B时,创建函数B的栈帧

函数B调用函数C时,创建函数C的栈帧

从函数C返回B时,函数C的栈帧就注销了

从函数B返回A时,函数B的栈帧就注销了

函数A执行完成后,其栈帧也注销了

上述仅粗略的描述了栈帧的创建与注销,下面以一个实例来展示过程。

2 RISC-V函数栈帧

以一个示例展示栈帧。

#include <stdio.h>

int Add(int x, int y)
{
	int z = 0;
	z = x + y;
	return z;
}

int main()
{
	int a = 10;
	int b = 20;
	int c = 0;
	c = Add(a, b);
	printf("%d\n", c);
	return 0;
}

其栈帧示意图如下:

不使用栈基址寄存器:

从上述执行过程也可以看出,其实不使用栈基址寄存器(s0/fp),仅使用栈指针寄存器(sp),函数也可以正常运行

gcc中可以使用如下方法开启关闭帧指针。

  • __attribute__((optimize("no-omit-frame-pointer"))) 修饰函数,开启帧指针
  • __attribute__((optimize("omit-frame-pointer"))) 修饰函数,关闭帧指针

在 RISC-V 架构中使用 s0 /fp来指向当前函数调用的栈帧顶部的寄存器。它主要用于:

  1. 栈帧导航:帮助确定当前栈帧的位置。
  2. 异常处理:在某些情况下,用于异常处理和堆栈回溯。

省略帧指针可以减少每次函数调用时所需的寄存器操作次数,从而提高程序的执行速度。但是,这样做也有一定的缺点,例如:

  • 调试困难:没有帧指针,调试时难以准确回溯堆栈。
  • 异常处理:某些依赖于准确堆栈信息的异常处理机制可能无法正常工作。

参考:

  1. Releases · riscv-non-isa/riscv-elf-psabi-doc (github.com)
  2. RISC-V架构的函数调用规范和栈布局_riscv函数调用规范-CSDN博客

标签:函数,int,ABI,之栈,RISC,函数调用,寄存器,指针
From: https://www.cnblogs.com/sureZ-learning/p/18450457

相关文章

  • 一起学RISC-V汇编第9讲之RISC-V ABI之函数调用
    目录1RISC-VABI接口2RISC-V函数调用约定2.1入参的传递2.2返回值的传递1RISC-VABI接口ABI(ApplicationBinaryInterface)为应用程序二进制接口,它定义了应用程序之间或应用程序和操作系统之间进行二进制级交互时必须遵循的规则和约定。ABI包括了关于函数调用约定(参数传递,函......
  • SciTech-Mathmatics-Probability+Statistics:Quantifing Uncertainty_统计分析: SciTec
    一般数学表示方法概率数学表示方法\(\large\begin{array}{rl}\\\bm{X}:&符合某种概率分布的Random\Variable(随机变量)\\\bm{x}:&\bm{rnorm},随机变量X的一个实例,,…\\\bm{f}:&\bm{pdf},\bm{dnorm},\text{ProbabilityDistributionFunction}\of\\text......
  • SciTech-Mathmatics-Probability+Statistics:Quantifing Uncertainty_多元数据统计分
    Chapt1学习目标理解多元数据及多元统计分析与一元统计分析的区别。掌握数据的计量尺度与数据类型。了解多元统计分析的应用分类。1.1 多元数据认知1.1.1多元数据的概念对任何一个现实问题要转化为一个统计问题,首要的工作是要对其特征进行刻画;一般采用随机变量,多......
  • SciTech-Mathmatics-Probability+Statistics:Quantifing Uncertainty_统计分析: SciTec
    一般数学表示方法概率数学表示方法\(\large\begin{array}{rl}\\\bm{X}:&符合某种概率分布的Random\Variable(随机变量)\\\bm{x}:&\bm{rnorm},随机变量X的一个实例,,…\\\bm{f}:&\bm{pdf},\bm{dnorm},\text{ProbabilityDistributionFunction}\of\\text......
  • SciTech-Mathmatics-Probability+Statistics:Quantifing Uncertainty_统计数据分析:
    多元数据和多元统计分析<<实用多元统计分析>>清华大学出版社,5校正文1.indd12023/9/1217:14:25Chapt1学习目标理解多元数据及多元统计分析与一元统计分析的区别。掌握数据的计量尺度与数据类型。了解多元统计分析的应用分类。1.1 多元数据认知1.1.1多元数据的......
  • Databinding(kotlin)
    简单使用(只作为view获取)build.gradle.kts配置android{dataBinding{enable=true}}activity注入//setContentView(R.layout.activity_main)valbinding:ActivityMainBinding=DataBindingUtil.setContentView(this,R.layout.activity_main......
  • 题解:TopCoder12316 ThreeColorability
    Vjudge可以出成《三色绘恋》背景。题意给一个格点数为\((n+1)\times(m+1)\)的网格,给格点染色,相邻的格点不能染成同样的颜色。每个格子有一条对角线的边,可选N形和Z形。现在有一个残缺的网格,存在一些格子的对角线连法不确定,构造一种字典序最小的方案使得至少存在一种染色......
  • PICO 2 RP2350使用官方推荐RISC-V编译器在O3优化下的coremark跑分,与Hazard3库宣传跑分
    编译环境:WSLUbuntu22.04GCC13.2.0 Hazard3存储库https://github.com/Wren6991/Hazard3/RP2350默认频率150MHz,编译内核为其RISC-V架构内核,在此频率下实测O3等级跑分453左右,O2等级跑分429左右。在测试时,当我打开第二个核心后,并且第二个核心只用来控制led灯,此时coremark跑......
  • RISC-V
    异常时只在与当前RISC-V线程中的指令相关联的运行时发生的不寻常条件术语trap陷阱指由RISC-V线程中发生的异常情况导致的控制同步转移到陷阱处理程序。、术语中断指与当前RISC-V线程异步发生的外部事件。当必须服务的中断发生时,一些指令被选择接收中断异常,随后遇到陷阱。数据......
  • llama-factory挂载pm2出现问题:node: /lib64/libstdc++.so.6: version `CXXABI_1.3.9'
    使用ssh连接服务器上运行llama-factory进行微调,但是一旦关闭ssh,程序也会随之关闭,而使用nohup命令会出现nohup:ignoringinput尝试采用pm2:(base)[hongjiayin@localhostLLaMA-Factory]$pm2startstart.shnode:/lib64/libstdc++.so.6:version`CXXABI_1.3.9'notfound......