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

news/2024/10/7 19:35:07

这一节讲解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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/68729.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

浏览器的渲染原理

浏览器渲染原理 五个渲染流程Parse 阶段:解析 HTMLStyle 阶段:样式计算三个阶段:收集,划分和索引所有样式表中存在的样式规则 访问每个元素并找到适用于该元素的所有规则,CSS 引擎遍历 DOM 节点,进行选择器匹配,并且匹配的节点执行样式设置 结合层叠规则和其他信息为节点…

CSP2024 前集训:多校A层冲刺NOIP2024模拟赛03

前言T1 没想到正难则反,脑瘫了没敢用 bitset(复杂度擦边但卡常能过),T2 空间开大了挂了 \(100pts\),\(T3\) 是原。 T1 五彩斑斓部分分 \(20pts\):\(O(n^4)\) 暴力。部分分 \(20+?pts\):进行一些优化,极限数据下仍是 \(O(n^4)\)。部分分 \(60\sim 100pts\):bitset 优化…

在C#中使用适配器Adapter模式和扩展方法解决面向的对象设计问题

之前有阵子在业余时间拓展自己的一个游戏框架,结果在实现的过程中发现一个设计问题。这个游戏框架基于MonoGame实现,在MonoGame中,所有的材质渲染(Texture Rendering)都是通过SpriteBatch类来完成的。举个例子,假如希望在屏幕的某个地方显示一个图片材质(imageTexture)…

React Fiber 原理

React Fiber 在 React 16 之前的版本对比更新 VirtualDOM 的过程是采用 Stack 架构实现的,也就是循环加递归,这种方式的问题是一旦任务开始进行就无法被中断。 如果应用中的组件数量庞大, Virtual DOM 的层级比较深,主线程被长期占用,知道整颗 Virtual DOM 树比对更新完成…

视野修炼-技术周刊第104期 | 下一代 JavaScript 工具链

① 🐙 尤大创办公司 VoidZero ② Tauri 2.0 稳定版发布 ③ Vite 时髦的新主页 ④ qrframe - 漂亮二维码生成 ⑤ HTTP QUERY 方法提案 ⑥ TinyJS - 轻量级的创建DOM元素 ⑦ 9月 Web 平台的新功能 ⑧ ESLint 现在正式支持 Linting JSON 和 Markdown欢迎来到第 104 期的【视野修…

雅礼国庆集训 day1 T2 折射

题面 题面下载 算法 转化题意 说白了就是给了你一堆点,让你数这种折线有多少个 (严格向下走,并且横坐标之间的差越来越小)看着像一种在 y 轴方向排序的 dp 但是由于是折线, 所以需要加一维来判断转向 dp 设计 状态设计 \(dp_{i, 0/1}\) 表示第 i 个点, 是向左下还是右上 状态…

20222315 2024-2025-1 《网络与系统攻防技术》实验一实验报告

1.实验内容 1.掌握反汇编与十六进制编程器 2.能正确修改机器指令改变程序执行流程 3.能正确构造payload进行bof攻击 2.实验过程 1.直接修改程序机器指令,改变程序执行流程 将pwn1文件下载至kali中并将pwn1文件改名为pwn20222315,并将其内容复制到pwn2反汇编文件objdump -d…