RISC-V架构的函数调用规范和栈布局

news2024/11/24 20:12:13

1、函数调用中寄存器规范

在这里插入图片描述

2、函数调用规范

(1)函数的前8个参数使用a0-a7寄存器传递,如果传参多于8个,则除前8个参数使用寄存器来传递之外,后面的参数使用栈传递;
(2)如果传递的参数小于寄存器宽度(64位),那么先按符号扩展到32位,再按符号扩展到64位;
(3)如果传递的参数为寄存器宽度的2倍(128位),那么将使用一对寄存器来传递参数;
(4)函数的返回值保存到a0和a1寄存器中;
(5)函数的返回地址保存在ra寄存器中;
(6)如果函数使用s0-s11寄存器,那么子函数在使用前需要把这些寄存器的内容保存到栈中,使用完之后再从栈中恢复内容到这些寄存器里;
(7)栈向下增长(向较低的地址),sp寄存器在进入函数时要对齐到16字节边界上。通过栈传递的第一个参数位于SP寄存器的偏移量0处,后续的参数存储在相应的较高地址处;
(8)如果GCC使用“-fno-omit-frame-pointer”编译选项,那么编译器使用s0作为栈帧指针;

3、C语言源代码

#include <stdio.h>
 
int main(void)
{
	//参数8、9、10要使用栈来传递		
	printf("data: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\n", 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);    
           
	return 0;
}

将C代码编译成汇编代码的命令:riscv64-linux-gnu-gcc -S test.c -o test.s

4、分析得到的汇编代码和栈布局

在这里插入图片描述

(1)printf函数中,第一个参数是字符串,就是表示格式的那个字符串;
(2)main函数调用printf中,将一些参数保存在了栈空间里,printf函数是可以访问到main函数的栈空间的,依赖sp和s0两个寄存器;

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

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

相关文章

《学术小白学习之路10》论文常见方法:Doc2vec-句向量模型实现

1. 数据 用于文献的摘要的相似度的计算 ## 导包 import pandas as pd import jieba import gensim from gensim.models import Doc2Vec from gensim.models.doc2vec import TaggedDocument再定义停用词典,用于分词,还可以自己定义一个分词词典 ## 读入数据 papers = pd.&l…

TensorFlow入门(一、环境搭建)

一、下载安装Anaconda 下载地址:http://www.anaconda.comhttp://www.anaconda.com 下载完成后运行exe进行安装 二、下载cuda 下载地址:http://developer.nvidia.com/cuda-downloadshttp://developer.nvidia.com/cuda-downloads 下载完成后运行exe进行安装 安装后winR cmd进…

解密PDF密码

PDF文件有两种密码&#xff0c;一个打开密码、一个限制编辑密码&#xff0c;因为PDF文件设置了密码&#xff0c;那么打开、编辑PDF文件就会受到限制。忘记了PDF密码该如何解密&#xff1f; PDF和office一样&#xff0c;可以对文件进行加密&#xff0c;但是没有提供恢复密码的功…

解决craco启动react项目卡死在Starting the development server的问题

现象&#xff1a; 原因&#xff1a;craco.config.ts配置文件有问题 经过排查发现Dev开发模式下不能有splitChunk的配置&#xff0c; 解决办法&#xff1a; 加一个生产模式的判断&#xff0c;开发模式不加载splitChunk的配置&#xff0c;仅在生产模式才加载 判断条件代码&#…

基于微信小程的流浪动物领养小程序设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

安防监控产品经营商城小程序的作用是什么

安防监控产品覆盖面较大&#xff0c;监控器、门禁、对讲机、烟感等都有很高用途&#xff0c;家庭、办公单位各场景往往用量不少&#xff0c;对商家来说&#xff0c;市场高需求背景下也带来了众多生意&#xff0c;但线下门店的局限性&#xff0c;导致商家想要进一步增长不容易。…

进阶指针(二)

#国庆发生的那些事儿# ✨博客主页&#xff1a;小钱编程成长记 &#x1f388;博客专栏&#xff1a;进阶C语言 &#x1f388;推荐相关博文&#xff1a;进阶指针&#xff08;一&#xff09; 进阶指针&#xff08;二&#xff09; 6.函数指针数组6.1例子 7.指向函数指针数组的指针8.…

OpenHarmony自定义组件介绍

一、创建自定义组件 在ArkUI中&#xff0c;UI显示的内容均为组件&#xff0c;由框架直接提供的称为系统组件&#xff0c;由开发者定义的称为自定义组件。在进行 UI 界面开发时&#xff0c;通常不是简单的将系统组件进行组合使用&#xff0c;而是需要考虑代码可复用性、业务逻辑…

四、YApi的安装和配置

YApi是去哪儿网的前端技术中心的一个开源可视化接口管理平台。 创建接口项目 创建接口 编写接口

中文读唇总动员:CNVSRC 2023 视觉语音识别挑战赛启动

由 NCMMSC 2023 组委会发起&#xff0c;清华大学、北京邮电大学、海天瑞声、语音之家共同主办的 CNVSRC 2023 中文连续视觉语音识别挑战赛即日启动&#xff0c;诚邀参与报名。 赛事官网&#xff1a;http://cnceleb.org/competition 视觉语音识别&#xff0c;也称唇语识别&…

为什么我的Windows 10笔记本电脑明明什么软件都没开,风扇却一直在转?

2023年9月29日&#xff0c;周五上午 这两天我的笔记本电脑一开机&#xff0c;风扇就一直在转&#xff0c;而且还没停过&#xff0c;挺吵的 即使什么软件都没开&#xff0c;还在那转&#xff0c;莫名其妙的。 后来我去任务管理器按照CPU使用情况来排序&#xff0c;发现原来是W…

如何自动转发接收的请求报头?

了解OpenTelemetry的朋友应该知道&#xff0c;为了将率属于同一个请求的多个操作&#xff08;Span&#xff09;串起来&#xff0c;上游应用会生成一个唯一的TraceId。在进行跨应用的Web调用时&#xff0c;这个TraceId和代表跟踪操作标识的SpanID一并发给目标应用&#xff0c;W3…

经过认证的工具链对安全关键型应用意味着什么?

作者&#xff1a;IAR 安全关键型应用&#xff0c;在很多人看来是个专业的词汇&#xff0c;但其实它离我们的日常生活很近&#xff0c;比如汽车驾驶系统、飞机控制系统、电梯运行系统、医疗设备等与我们息息相关的事物都可以纳入安全关键型应用的范畴。 对于这类应用&#xff…

SAP入门到放弃系列之QM检验计划-Part1

文章目录 一、概述1.1、检验计划抬头1.2、检验计划工序 二、系统操作2.1、测试数据准备&#xff1a;2.2、创建检验计划 一、概述 检验计划是用来描述如何对一种或多种物料进行质量检验操作的主数据。在检验计划中&#xff0c;可以定义检验的工序顺序以及可用于检验特征的数据规…

排序:归并(Merge)排序算法分析

1.归并操作 归并:把两个或多个已经有序的序列合并成一个。 2路归并&#xff1a;二合一k路归并&#xff1a;k合一结论:m路归并&#xff0c;每选出一个元素需要对比关键字m-1次。 2.算法思想 核心操作:把数组内的两个有序序列归并为一个。 例如&#xff1a; 3.代码实现 将…

数据集笔记: Porto

数据来源&#xff1a;Taxi Trajectory Data_数据集-阿里云天池 (aliyun.com) 1 数据介绍 葡萄牙波尔图市运行的所有442辆出租车的全年轨迹&#xff08;从2013年7月1日至2014年6月30日&#xff09; 2 读取数据 import pandas as pdtrapd.read_csv(C:/Users/16000/Download…

C语言中动态内存管理

前言&#xff1a;为什么存在动态内存分配&#xff0c;为什么要用动态内存分配&#xff0c;动态内存分配的意义。鸡汤&#xff1a;有了坚持不一定成功,但没有坚持&#xff0c;就注定失败&#xff0c;各位也要努力坚持提升自己&#xff01; 动态内存分配 动态内存函数&#xff1a…

【Linux】 du 命令使用

问题 No space left on device 请求接口返回 java.io.IOException: No space left on device 设备上没有剩余空间 怎么解决问题&#xff1a; 查看这篇文章&#xff1a;一次 linux 服务器磁盘使用情况排查 我们提到命令&#xff1a;du -sh * 到底这个命令是干什么的咱们…

EXPLAIN 语句输出的各个列解释

title: “EXPLAIN 语句输出的各个列解释” createTime: 2022-03-06T15:52:4108:00 updateTime: 2022-03-06T15:52:4108:00 draft: false author: “ggball” tags: [“mysql”] categories: [“db”] description: “” EXPLAIN 语句输出的各个列解释 列名描述id在一个大的查…

多线程(基础)

文章目录 1. 线程的声明周期1.1 JDK 中用 Thread.State 枚举表示了线程的几种状态1.2 线程状态转换图 2. 线程的同步2.1 Synchronized 线程同步机制 3. 互斥锁3.1 注意事项和细节3.2 守护线程 setDaemon()方法 4. 线程的死锁5. 释放锁6. 课后练习 1. 线程的声明周期 1.1 JDK 中…