RISC-V基础之函数调用(一)简单的函数调用(包含实例)

高级语言支持函数(也称为过程或子程序)来重用通用的代码,以及使程序更加模块化和可读。函数可以有输入,称为参数,和输出,称为返回值。函数应该计算返回值,并且不产生其他意外的副作用。

在一个函数调用另一个函数时,调用者(caller)和被调用者(callee)必须约定好在哪里放置参数和返回值。在RISC-V程序中,惯例是调用者在进行函数调用前将最多八个参数放在寄存器a0到a7中,而被调用者在完成前将返回值放在寄存器a0中。遵循这个惯例,两个函数都知道在哪里找到参数和返回值,即使调用者和被调用者是由不同的人编写的。

被调用者不能干扰调用者的行为。这意味着被调用者必须知道在完成后返回到哪里,而且不能破坏调用者需要的任何寄存器或内存。调用者在使用跳转并链接(jump and link)指令(jal)跳转到被调用者时,同时将返回地址存储在返回地址寄存器ra中。被调用者不能覆盖任何架构状态或内存,因为这些是调用者依赖的。具体来说,被调用者必须保持保存寄存器(s0−s11)、返回地址(ra)和堆栈(一部分内存用于临时变量)不变。

 如上实例:

上图展示了主函数(main)调用简单函数(simple)的过程。main是调用者,simple是被调用者。simple函数没有输入参数,也没有返回值,它只是返回给调用者。在 Example中,每条RISC-V指令的左边给出了示例指令地址。jal和jr ra是函数调用和返回所必需的两条指令。主函数通过执行jal simple来调用simple函数,这个指令做了两件事:它跳转到目标指令的地址,即simple所在的地址(0x0000051C),并且把返回地址,即jal后面的指令的地址(在这个例子中是0x00000304)存储在返回地址寄存器(ra)中。程序员可以指定哪个寄存器被写入返回地址,但默认是ra。simple函数立即通过执行jr ra来返回,这个指令跳转到ra寄存器中保存的指令地址。主函数然后继续在这个地址(0x00000304)执行

RISC-V的约定是,函数使用a0到a7这八个寄存器来传递输入参数,其中a0是最左边的参数,a7是最右边的参数。函数使用a0寄存器来返回输出值。如果函数有多于八个的输入参数,那么多余的参数会被放在栈上。

上例展示了一个名为diffofsums的函数,它接收四个输入参数,并返回一个输出值。result是一个局部变量,我们选择把它保存在s3寄存器中。
根据RISC-V的约定,调用函数(main)在调用被调用函数(diffofsums)之前,把函数参数从左到右放入输入寄存器a0到a7中。被调用函数(diffofsums)把返回值存储在返回寄存器a0中。当函数返回时,调用函数(main)可以从a0中读取返回值。 

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

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

相关文章

全球数据泄露事件增加近三倍

网络安全公司 Surfshark 的最新研究显示,2023 年第二季度共有 1.108 亿个账户遭到泄露,其中美国排名第一,几乎占 4 月至 6 月所有泄露事件的一半。 俄罗斯排名第二,西班牙排名第三,其次是法国和土耳其。 与 2023 年…

【ChatGPT 指令大全】怎么利用ChatGPT写报告

目录 选定切入角度 报告开头 大纲生成 草稿撰写 研究报告 提出反对观点 报告总结 研究来源 总结 随着人工智能技术的快速发展,自然语言处理技术在各个领域的应用越来越广泛。其中,ChatGPT作为目前最先进的自然语言处理模型之一,其强…

MacBook触控板窗口管理 Swish for Mac

Swish for Mac是一款用于通过手势来控制mac应用窗口的软件,你可以通过这款软件在触控板上进行手势控制,你可以在使用前预设好不同手势的功能,然后就能直接通过这些手势让窗口按照你想要的方式进行变动了 Swish 支持 Haptick Feedback 震动反…

计算机网络(4) --- 协议定制

计算机网络(3) --- 网络套接字TCP_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/132035757?spm1001.2014.3001.5501 目录 1. 协议的基础知识 TCP协议通讯流程 ​编辑 2.协议 1.介绍 2.手写协议 1.内容 2.接口 …

功率放大器的种类及其特点是什么

功率放大器是一种电子设备,用于将输入信号放大到足以驱动扬声器或其他负载所需的电平。根据不同的工作方式和应用场景,功率放大器可以分为多种类型。下面安泰电子就介绍几种常见的功率放大器及其特点: A类功率放大器 A类功率放大器是最原始、…

JVM内存模型结构

什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一个虚构出来的计算机,有着自己完善的硬件架构,如处理器、堆栈等。 为什么需要JVM? Java语言使用Java虚拟机屏蔽了与具体平台相关的信息&…

使用可视化docker浏览器,轻松实现分布式web自动化

01、前言 顺着docker的发展,很多测试的同学也已经在测试工作上使用docker作为环境基础去进行一些自动化测试,这篇文章主要讲述我们在docker中使用浏览器进行自动化测试如果可以实现可视化,同时可以对浏览器进行相关的操作。 02、开篇 首先…

Android Tencent Shadow 插件接入指南

Android Tencent Shadow 插件接入指南 插件化简述一、clone 仓库二、编译运行官方demo三、发布Shadow到我们本地仓库3.1、安装Nexus 3.x版本3.2、修改发布配置3.3、发布仓库3.4、引用仓库包 四、编写我们自己的代码4.1、新建项目导入maven等共同配置4.1.1、导入buildScript4.1.…

音视频--DTMF信号发送及检测

参考资料 https://zh.wikipedia.org/wiki/%E5%8F%8C%E9%9F%B3%E5%A4%9A%E9%A2%91https://www.cnblogs.com/lijingcheng/p/4454932.html 1. DTMF是什么 1.1 DTMF定义 双音多频信号(英语:Dual-Tone Multi-Frequency,简称:DTMF&a…

vscode如何退出/切换 github 账号

退出/切换 github 账号 左下角点击头像按钮,选择注销,然后再重新登录

Alchemy Catalyst 2023 crack

Alchemy Catalyst 2023 crack Alchemy CATALYST是一个可视化本地化环境,支持本地化工作流程的各个方面。它帮助组织加快本地化进程,比竞争对手更快地进入新市场,并为他们创造新的收入机会。 创建全球影响力 高质量的产品和服务翻译对跨国组织…

Linux tcpdump 命令详解

简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的…