当前位置: 首页 > news >正文

RISC-V基础之函数调用(二)栈与寄存器(包含实例)

堆栈是一种后进先出(LIFO)的队列,用于存储函数调用时的临时数据和现场数据。堆栈指针sp(寄存器2)是一个普通的RISC-V寄存器,按照惯例,指向堆栈的顶部。堆栈从高地址向低地址增长,即当需要更多的临时空间时,堆栈指针sp减小。

函数调用时,如果函数参数和局部变量很多,寄存器放不下,需要开辟堆栈空间存储。中断发生时,堆栈空间用于存放当前执行程序的现场数据(下一条指令地址、各种缓存数据),以便中断结束后恢复现场。开辟和释放堆栈空间的方法是调整堆栈指针sp的值。

函数调用时,为了避免函数修改除了a0之外的其他寄存器的值,造成主程序的寄存器内容被破坏,需要在函数执行前将需要修改的寄存器的值保存到堆栈上,然后在函数返回前将它们从堆栈上恢复。具体的步骤是:

  • 在堆栈上分配空间来存储一个或多个寄存器的值
  • 将寄存器的值存储到堆栈上
  • 执行函数使用寄存器
  • 从堆栈上恢复寄存器的原始值
  • 释放堆栈空间

堆栈通常颠倒存储在存储器中,使得堆栈顶部实际上是最低地址,并且堆栈向下朝向较低存储器地址增长。 这称为降序堆栈。 一些架构还允许向上的堆栈向更高的内存地址增长。 堆栈指针(sp)通常指向堆栈上的最顶层元素; 这称为全栈。 某些体系结构(例如 ARM)还允许空堆栈,其中 sp 指向堆栈顶部之外的一个字。 RISC-V架构定义了函数传递变量和使用堆栈的标准方式,以便不同编译器开发的库可以互操作。 它指定了一个完整的降序堆栈。

 RISC-V指定的降序堆栈如下图所示: 

 

 

 

上图代码示例展示了一个改进的diffofsums函数,它在修改t0,t1和s3寄存器之前将它们保存到堆栈上,并在返回前将它们从堆栈上恢复。这样可以避免破坏调用者的寄存器内容。

下图展示了在调用代码示例中的diffofsums函数之前,期间和之后的堆栈情况。堆栈一开始在0xBEF0F0FC。diffofsums通过将堆栈指针sp减少12来为三个字分配堆栈空间。然后它将t0,t1和s3寄存器中的当前值存储在新分配的空间中。它执行函数的其余部分,改变这三个寄存器的值。在函数结束时,diffofsums从堆栈上恢复这些寄存器的值,释放它的堆栈空间,并返回。当函数返回时,a0保存了结果,但没有其他副作用:t0,t1,s3和sp与函数调用前具有相同的值。

 

一个函数为自己分配的堆栈空间称为它的堆栈帧(stack frame)。diffofsums的堆栈帧有三个字深。模块化原则告诉我们,每个函数只应访问自己的堆栈帧,而不是属于其他函数的帧。

相关文章:

RISC-V基础之函数调用(二)栈与寄存器(包含实例)

堆栈是一种后进先出(LIFO)的队列,用于存储函数调用时的临时数据和现场数据。堆栈指针sp(寄存器2)是一个普通的RISC-V寄存器,按照惯例,指向堆栈的顶部。堆栈从高地址向低地址增长,即当…...

解析器模式(C++)

定义 给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句子。 应用场景 在软件构建过程中,如果某一特定领域的问题比较复杂,类似的结构不断重复出现,如果使用…...

电子元器件选型与实战应用—02 电容选型第1篇(8000字)

文章目录 0. 电阻选型案例回顾1. 入门知识1.1 基础1.2 串并联1.3 常用容值1.4 常用品牌2. 参数详解2.1 静电容量2.2 额定电压2.3 精度2.4 漏电流和绝缘电阻2.5 ESR3. 电容种类3.1 陶瓷电容3.1.1 陶瓷电容优缺点3.1.2 容量和电压的关系3.1.3 陶瓷电容的介质3.1.4 容量和温度的关…...

试图将更改推送到 GitHub,但是远程仓库已经包含了您本地没有的工作(可能是其他人提交的修改)

这通常是由于其他人或其他仓库推送到了相同的分支上,导致您的本地仓库和远程仓库之间存在冲突。 错误信息: To github.com:8upersaiyan/CKmuduo.git ! [rejected] main -> main (fetch first) error: failed to push some refs to github.com:8upers…...

Lamport向量时钟算法的C++实现:在分布式系统中生成事件的部分排序并检测因果关系违规

在处理分布式系统时,我们经常遇到的一个问题是如何跟踪和排序系统中发生的各种事件。这是一个非常重要的问题,因为在分布式系统中,事件的顺序可能会影响系统的行为和结果。为了解决这个问题,我们可以使用一种称为向量时钟的算法。…...

多个excel的sheet合并到一个excel下

目标:多个excel的sheet合并到一个excel下(不同sheet) 要求:原始数据不同excel中的sheet名不同 import pandas as pd import os# 多个Excel文件所在的文件夹路径 folder_path r"D:\data\sheet"# 输出合并后的Excel文件…...

【Fegin技术专题】「原生态」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(中)

你可以使用 Jersey 和 CXF 这些来写一个 Rest 或 SOAP 服务的java客服端。 你也可以直接使用 Apache HttpClient 来实现。但是 Feign 的目的是尽量的减少资源和代码来实现和 HTTP API 的连接。 *通过自定义的编码解码器以及错误处理,你可以编写任何基于文本的 HTT…...

leetcode--每日一题--822--344(使用异或来进行数据交换)

822.翻转卡片游戏 在桌子上有 n 张卡片,每张卡片的正面和背面都写着一个正数(正面与背面上的数有可能不一样)。 我们可以先翻转任意张卡片,然后选择其中一张卡片。 如果选中的那张卡片背面的数字 x 与任意一张卡片的正面的数字都…...

OpenStreetMap数据转3D场景【Python + PostgreSQL】

很长一段时间以来,我对 GIS 和渲染感兴趣,在分别尝试这两者之后,我决定最终尝试以 3D 方式渲染 OpenStreetMap 中的地理数据,重点关注不超过城市的小规模。 在本文中,我将介绍从建筑形状生成三角形网格、以适合 Blend…...

动力节点|MyBatis入门实战到深入源码

MyBatis是一种简单易用、灵活性高且高性能的持久化框架,也是Java开发中不可或缺的一部分。 动力节点老杜的MyBatis教程,上线后广受好评 从零基础小白学习的角度出发,层层递进 从简单到深入,从实战到源码 一步一案例,一…...

分布式规则引擎框架的设计

MirAIe 规则引擎是一个可扩展且可扩展的规则引擎框架,允许用户对多个活动进行分组和自动化。 过去几年,在开发MirAIe 物联网平台时,我们意识到需要一个可扩展、可扩展的规则引擎框架。规则引擎使您能够对各种操作进行分组、管理和自动化&…...

C#开发FFMPEG例子(API方式) FFmpeg推送udp组播流

代码及工程见https://download.csdn.net/download/daqinzl/88156926 开发工具:visual studio 2019 播放,可采用ffmpeg工具集里的ffplay.exe, 执行命令 ffplay udp://238.1.1.10:6016 也可以参考(C#开发FFMPEG例子(API方式) FFmpeg拉取udp组播流并播放)…...

nvm下载node导致npm报错无法使用

有个依赖库需要更新下node,用nvm下载后项目跑不起来了,npm -v 还报错 其实一开始是npm下载不来,然后换了淘宝镜像后还是报错 然后就只能手动下载下了 进入node.js官网 https://nodejs.org/en/download 下载后注意要安装在你nvm目录中&#x…...

LeetCode 热题 100JavaScript--2. 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 …...

zookeeper总结

1.概念 Zookeeper 是一个分布式协调服务,可用于服务发现,分布式锁,分布式领导选举,配置管理等。Zookeeper 提供了一个类似于 Linux 文件系统的树形结构(可认为是轻量级的内存文件系统,但只适合存少量信息&…...

【程序环境与预处理玩转指南】

本章重点: 程序的翻译环境 程序的执行环境 详解:C语言程序的编译链接 预定义符号介绍 预处理指令 #define 宏和函数的对比 预处理操作符#和##的介绍 命令定义 预处理指令 #include 预处理指令 #undef 条件编译 1. 程序的翻译环境和执行环境 在…...

搭建简易syslog日志中转服务器

在某种场景下,无法接入日志审计设备,本文提供一种方式,可通过搭建简易日志中转服务器,收集到该环境下的日志后,再将其导入日志审计设备中。 0x1 开启服务 rsyslog守护进程来自于当前的linux发布版本的预装模块&#x…...

MongoDB文档-进阶使用-spring-boot整合使用MongoDB---MongoRepository完成增删改查

阿丹: 之前学习了在MongoDB客户端上的MongoDB语句现在将MongoDB整合到spring项目。 传送门: MongoDB文档--基本概念_一单成的博客-CSDN博客 MongoDB文档--基本安装-linux安装(mongodb环境搭建)-docker安装(挂载数据卷…...

什么是线程局部变量?

在Java中,线程局部变量(Thread Local Variable)是一种特殊类型的变量,每个线程都有其自己独立的副本。这意味着每个线程可以在该变量上进行操作,而不会影响其他线程的副本。线程局部变量通常用于在多线程环境中存储线程私有的数据&#xff0c…...

Jmeter响应中的乱码问题

文章目录 问题描述解决办法 问题描述 Jmeter在访问接口的时候,响应内容如果有中文可能会显示乱码 响应页面没有做编码处理,JMeter默认按照ISO-8859-1编码格式进行解析 解决办法 在线程组中添加BeanShell PostProcessor后置处理器 prev.setDataEnco…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层&#xf…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...