RISC-V基础之函数调用(三)保留寄存器(包含实例)

RISC-V将寄存器分为保留和非保留两类。保留寄存器是指在函数调用前后必须保持相同值的寄存器,因为调用者期望在调用后能够继续使用这些寄存器的值。保留寄存器包括s0到s11(因此称为saved),sp和ra。非保留寄存器,也称为临时寄存器,是指在函数调用中可以自由修改的寄存器,不需要保存和恢复。非保留寄存器包括t0到t6(因此称为temporary)和a0到a7,即参数寄存器。

函数调用时,如果一个函数需要修改保留寄存器的值,那么它必须在修改前将它们保存到堆栈上,并在返回前将它们从堆栈上恢复。这样可以避免破坏调用者的寄存器内容。而如果一个函数只修改非保留寄存器的值,那么它就不需要保存和恢复它们,因为调用者不会再使用它们。

 

上述代码示例假设所有使用的寄存器(t0,t1和s3)都必须保存和恢复。但是如果调用者没有使用这些寄存器,那么保存和恢复它们就是浪费时间和空间。为了避免这种浪费,如下展示了一个更优化的版本的diffofsums函数,它只保存了s3到堆栈上。t0和t1是非保留寄存器,所以不需要保存。

 

如果一个函数需要修改保留寄存器的值,那么它必须在修改前将它们保存到堆栈上,并在返回前将它们从堆栈上恢复。这样可以避免破坏调用者的寄存器内容。而如果一个函数只修改非保留寄存器的值,那么它就不需要保存和恢复它们,因为调用者不会再使用它们。

下表总结了哪些寄存器是保留的。一般来说,s0到s11用于存储函数内部的局部变量,所以它们必须被保存。ra也必须被保存,因为它记录了返回地址。t0到t6用于存储临时结果。这些计算通常在函数调用前完成,所以它们不需要被保存,并且很少有情况下调用者需要保存它们。a0到a7经常在函数调用过程中被覆盖。因此,如果调用者在被调用函数返回后还依赖于自己的某些参数,那么它们必须被保存。

 更详细的说明可参考操作系统基础知识介绍之指令集体系结构:RISC-V寄存器(掺杂与ARM和X86部分比对)_操作系统的指令集_管二狗赶快去工作!的博客-CSDN博客

 堆栈指针sp以上的堆栈空间是自动保留的,只要被调用者不写入sp以上的内存地址。这样可以避免修改其他函数的堆栈帧。堆栈指针本身也是保留的,因为被调用者在返回前会释放自己分配的堆栈帧,即将sp加回与函数开始时相同的值。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

湘大 XTU OJ 1223 Repeat One 题解:最后面进行取模转变成一边取模一边计算

一、链接 Repeat One 二、题目 题目描述 求由最小的一个N,N个数码1组成的数能被M整除? 比如M3时,111能被3整除。M2时,则不存在这样的N。 输入 第一行是一个整数K(K≤1,000),表示样例的个数。 以后每行一个整数M(1≤M≤1,000,000…

Canal+Kafka实现Mysql数据同步

Canal介绍 canal [kənl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 canal可以用来监控数据库数据的变化,从而获得新增数据,或者修改的数据。 canal是应阿里巴巴存在杭…

什么是Linux,如何在Windows操作系统下搭建Linux环境,远程连接Linux系统

文章目录 什么是LinuxLinux的诞生及发展为什么要学习LinuxLinux内核Linux发行版什么是虚拟机如何在VMware虚拟机中搭建Linux系统环境远程连接 Linux 系统Linux 帮助网站 什么是Linux Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户…

在rviz中实时显示车辆轨迹

在工作空间中创建包 cd ~/catkin_ws/src catkin_create_pkg trajectory_display_example roscpp nav_msgs sensor_msgs在src文件夹下创建一个C源文件 #include <ros/ros.h> #include <nav_msgs/Odometry.h> #include <nav_msgs/Path.h> #include <senso…

【高危】Microsoft Office Visio 远程执行代码漏洞

漏洞描述 Microsoft Office Visio 是微软公司开发的一款流程图和矢量图绘制工具。 Microsoft Office Visio 受影响版本中&#xff0c;当解析攻击者恶意制作的Visio文件时&#xff0c;攻击者可以在应用程序上下文执行任意代码。 漏洞名称Microsoft Office Visio 远程执行代码…

Android Studio实现简单ListView

效果图 MainActivity package com.example.listviewtest;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle; import android.widget.ListView;import com.example.listviewtest.adapter.PartAdapter; import com.example.listviewtest.bean.PartB…

http相关知识点

文章目录 长链接http周边会话保持方案1方案2 基本工具postmanFiddlerFiddler的原理 长链接 一张网页实际上可能会有多种元素组成&#xff0c;这也就说明了网页需要多次的http请求。可由于http是基于TCP的&#xff0c;而TCP创建链接是有代价的&#xff0c;因此频繁的创建链接会…

排序(快速排序,归并排序,插入排序,选择排序,冒泡排序,希尔排序,堆排序)

给定你一个长度为 n 的整数数列。 请你对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行&#xff0c;第一行包含整数 n 。 第二行包含 n 个整数&#xff08;所有整数均在 1∼109 范围内&#xff09;&#xff0c;表示整个数列。 输…

数学建模—分类模型

本讲将介绍分类模型。对于而分类模型&#xff0c;我们将介绍逻辑回归&#xff08;logistic regression&#xff09;和Fisher线性判别分析两种分类算法&#xff1b;对于多分类模型&#xff0c;我们将简单介绍Spss中的多分类线性判别分析和多分类逻辑回归的操作步骤下。 本题按水…

基于 JMeter API 开发性能测试平台

目录 背景&#xff1a; 常用的 JMeter 类和功能的解释&#xff1a; JMeter 编写性能测试脚本的大致流程示意图&#xff1a; 源码实现方式&#xff1a; (1) 环境初始化 (2) 环境初始化 (3) 创建测试计划 (4) 创建 ThreadGroup (5) 创建循环控制器 (6) 创建 Sampler (…

探索 TypeScript 元组的用例

元组扩展了数组数据类型的功能。使用元组&#xff0c;我们可以轻松构造特殊类型的数组&#xff0c;其中元素相对于索引或位置是固定类型的。由于 TypeScript 的性质&#xff0c;这些元素类型在初始化时是已知的。使用元组&#xff0c;我们可以定义可以存储在数组中每个位置的数…

【C++基础(八)】类和对象(下)--初始化列表,友元,匿名对象

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C初阶之路⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 类和对象 1. 前言2. 初始化列表2.1初始化列表的作用…

MyCat配置rule.xml、server.xml讲解

1. rule.xml分片规则配置文件 rule.xml中配置的主要就是拆分表的规则&#xff0c;rule.xml中主要包含两类标签 tableRule 和Function。 tableRule标签里面主要配置我们的分片规则&#xff0c;Function里面涉及的是分片规则里面所涉及的java类&#xff0c;都是在function中配置…

原生js发送ajax请求---ajax请求篇(一)

在原生js中我们使用的是XMLHttpRequest对象来发送ajax请求 主要步骤就是&#xff1a; 1.创建XMLHTTPRequest对象 2.使用open方法设置和服务器的交互信息 3.设置发送的数据&#xff0c;开始和服务器端交互 4.注册事件 5.更新界面 &#xff08;1&#xff09; get方式 //步骤一…

GIT-HUB上传大文件.docx

下载git Github上传大文件&#xff08;&#xff1e;25MB&#xff09;教程_UestcXiye的博客-CSDN博客 上传流程 https://blog.csdn.net/weixin_35770067/article/details/116564429?spm1001.2101.3001.6661.1&utm_mediumdistribute.pc_relevant_t0.none-task-blog-2%7Ed…

Grafana集成prometheus(1.Prometheus安装)

下载docker镜像 docker pull prom/prometheus docker pull prom/node-exporter启动 node-exporter 该程序用以采集机器内存等数据 启动脚本 docker run -d -p 9100:9100 prom/node-exporter ss -anptl | grep 9100启动截图 prometheus 启动脚本 # 3b907f5313b7 为镜像i…

电脑开机出现Boot Device怎么办?

开机出现Boot Device这个问题很常见&#xff0c;有时还会出现No Boot Device的问题&#xff0c;虽然多了一个单词&#xff0c;但意思是相同的&#xff0c;这些问题说明你的系统盘出现了问题&#xff0c;或者是引导出现了问题。这该如何解决呢&#xff1f; 方法1. 检查主板或硬盘…

[保研/考研机试] 括号匹配问题 C++实现

题目描述&#xff1a; 在某个字符串(长度不超过100)中有左括号、右括号和大小写字母&#xff1b;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序&#xff0c;找到无法匹配的左括号和右括号&#xff0c;输出原来的字符串&am…

CS 144 Lab Four -- the TCP connection

CS 144 Lab Four -- the TCP connection TCPConnection 简述TCP 状态图代码实现完整流程追踪 测试 对应课程视频: 【计算机网络】 斯坦福大学CS144课程 Lab Four 对应的PDF: Lab Checkpoint 4: down the stack (the network interface) TCPConnection 简述 TCPConnection 需要…

利用Jmeter做接口测试全流程分析

利用Jmeter做接口测试怎么做呢&#xff1f;过程真的是超级简单。 明白了原理以后&#xff0c;把零碎的知识点填充进去就可以了。这篇文章就来介绍一下如何利用Jmeter做接口测试的流程&#xff0c;主要针对的是功能测试。暂不涉及到自动化测试和性能测试的内容。 一把来说&…