RISC-V调用惯例
寄存器惯例
Preserved across calls?
字面意思是跨调用保留,什么意思呢,也就是标记为YES
的寄存器,需要在子程序执行前后保持不变。如何做到这一点呢,那就是子程序使用这些YES
寄存之前,需要把这些寄存器压栈,用完以后从栈中恢复这些寄存器的值。
标记为NO
的呢,子程序执行的时候是不关心的,如果NO
寄存器,不希望子程序(callee)执行前后被改变,那就需要程序的调用者(caller)在子程序执行前压栈,子程序执行后出栈恢复寄存器值。
总结:标记为YES
的需要callee保存(子程序自己保存),标记为NO
的需要caller保存(调用者保存)。
注意:
保持寄存器值不变的方式不一定只有入栈和出栈,比入SP是
YES
子程序调用后保持SP的值不变,那么可以在子程序的开始把
SP减去一个值,在子程序的最后把SP加上一个值,保持调用前后不变。如下面程序片段所示
示例:
(gdb) disass main
Dump of assembler code for function main:0x0000000000010158 <+0>: addi sp,sp,-32 #在这里开辟栈大小0x000000000001015a <+2>: sd ra,24(sp)0x000000000001015c <+4>: sd s0,16(sp)0x000000000001015e <+6>: addi s0,sp,320x0000000000010160 <+8>: li a5,10x0000000000010162 <+10>: sw a5,-20(s0)0x0000000000010166 <+14>: li a5,20x0000000000010168 <+16>: sw a5,-24(s0)0x000000000001016c <+20>: lw a4,-20(s0)0x0000000000010170 <+24>: lw a5,-24(s0)0x0000000000010174 <+28>: addw a5,a5,a40x0000000000010176 <+30>: sw a5,-28(s0)0x000000000001017a <+34>: lw a5,-28(s0)0x000000000001017e <+38>: mv a1,a50x0000000000010180 <+40>: lui a5,0x1c0x0000000000010182 <+42>: addi a0,a5,176 # 0x1c0b00x0000000000010186 <+46>: jal ra,0x10332 <printf>0x000000000001018a <+50>: li a5,00x000000000001018c <+52>: mv a0,a50x000000000001018e <+54>: ld ra,24(sp)0x0000000000010190 <+56>: ld s0,16(sp)0x0000000000010192 <+58>: addi sp,sp,32 #用完以后恢复0x0000000000010194 <+60>: ret
End of assembler dump.
参考:
CALLER AND CALLEE SAVED REGISTERS
RISC-V调用惯例相关推荐
- 计组学习笔记2(RISC v版)
指令集解释 (规定:R[r]表示通用寄存器r的内容,M[addr]表示存储单元addr的内容,SEXT[imm]表示对imm进行符号扩展,ZEXT[imm]表示对imm进行零扩展) 整数运算类 -U型 ...
- 1.3 函数调用反汇编解析以及调用惯例案例分析
首先来段代码来瞧瞧: #include <stdio.h>int add(int x,int y){int z;z=x+y;return z; }int main(){int r=add( ...
- RISC V (RV32+RV64) 架构 整体介绍
文章目录 riscv 市场 芯片介绍 软件介绍 开发板介绍 PC介绍 riscv 架构 编程模型(指令集/寄存器/ABI/SBI) 运行状态 指令集 寄存器 riscv32和riscv64两者的区别 ...
- alin的学习之路:C语言篇(一)(内存四区模型,宏函数,调用惯例,内存存储方式)
@TOC(内存四区模型,宏函数,调用惯例,内存存储方式) 1. 内存四区及其使用注意 内存四区:代码区,全局静态区,栈区,堆区 代码区 代码区存放的是CPU执行的二进制指令 特点: 只读 共享 栈区 ...
- 安装Ubuntu RISC V toolchain失败(网速、git配置原因)
git获取大容量工程出错:RPC failed: curl GnuTLS recv error : Decryption has failed. error: RPC failed; curl 56 ...
- quartus .bdf格式 和 .v格式 互相转换及调用
1 生成 .bdf文件 file → new → block diagram/schematic file 2 .v 调用 .bdf 将 .bdf 文件转换为 .v文件再调用 .v文件 ...
- WIN10剪切板打不开无法调用win+v无法打开
1.确认设置-->剪切板设置-->剪切板打开 2.第一步打开之后仍然无法调用尝试第二步 管理员运行cmd-->输入以下命令 DISM /Online /Add-Capability ...
- c语言strcat_s用于调用的参数太少_为什么系统调用会消耗较多资源呢
为什么这么设计(Why's THE Design)是一系列关于计算机领域中程序设计决策的文章,我们在这个系列的每一篇文章中都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点.对具体实现造成的影响 ...
- 调用系统相机和相册,并且裁剪成圆形图片(解决6.0,7.0,8.0版本问题)
之前写过一篇博客,那篇博客对7.0手机裁剪图片的问题没有进行解决,现在对之前的那篇博客进行补充,解决了Android6.0,7.0,8.0版本问题,不仅可以调用相册,相机,还可以将图片保存到本地,并且 ...
最新文章
- C++——运算符的重载---以成员函数方式重载---以友元函数方式重载
- oracle如何降低逻辑读,如何降低该SQL的逻辑读
- VTK:可视化之ScalarBarActorColorSeries
- Retrofit与RXJava整合
- 计算机硬盘能达到5g的速度,5G号称可以达到几GB每秒,但是目前的手机处理器和硬盘可以处理这么庞大的数据量吗?...
- mysql 锁定表_MySQL表锁定
- 365RSS.cn = Web3.0?
- 供应XBF-01型多功存储介质粉碎机
- vue.js官方中文文档
- 以阿里云服务器为例理解docker端口映射
- html5 embed居中,HTML5标签embed详解
- 太湖之光超级计算机应用最高奖,“神威·太湖之光”两项应用入围“戈登·贝尔”奖...
- nmap扫描mysql弱口令_弱口令检测和端口扫描
- mixly for linux64,Mixly编程for Linux
- 微信小程序学习用demo:大写计算器;数字转换为大写
- Phonics 自然拼读法 sm sn sl sw sp st sc sk all ew y 小结与回顾
- 店铺推广前准备工作有哪些?
- 华为笔记本matebook13_华为MateBook 13酷睿i3版体验:极致的2K屏轻薄笔记本
- C#条型码二维码批量识别工具 可以从粘贴板获取图片或路径等 MFC消息示例
- 算法流程图组件的基本含义及画法举例(Kmeans)