寄存器惯例

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调用惯例相关推荐

  1. 计组学习笔记2(RISC v版)

    指令集解释 (规定:R[r]表示通用寄存器r的内容,M[addr]表示存储单元addr的内容,SEXT[imm]表示对imm进行符号扩展,ZEXT[imm]表示对imm进行零扩展) 整数运算类 -U型 ...

  2. 1.3 函数调用反汇编解析以及调用惯例案例分析

    首先来段代码来瞧瞧: #include <stdio.h>int add(int x,int y){int z;z=x+y;return z; }int main(){int r=add( ...

  3. RISC V (RV32+RV64) 架构 整体介绍

    文章目录 riscv 市场 芯片介绍 软件介绍 开发板介绍 PC介绍 riscv 架构 编程模型(指令集/寄存器/ABI/SBI) 运行状态 指令集 寄存器 riscv32和riscv64两者的区别 ...

  4. alin的学习之路:C语言篇(一)(内存四区模型,宏函数,调用惯例,内存存储方式)

    @TOC(内存四区模型,宏函数,调用惯例,内存存储方式) 1. 内存四区及其使用注意 内存四区:代码区,全局静态区,栈区,堆区 代码区 代码区存放的是CPU执行的二进制指令 特点: 只读 共享 栈区 ...

  5. 安装Ubuntu RISC V toolchain失败(网速、git配置原因)

    git获取大容量工程出错:RPC failed: curl GnuTLS recv error : Decryption has failed. error: RPC failed; curl 56 ...

  6. quartus .bdf格式 和 .v格式 互相转换及调用

    1 生成 .bdf文件   file → new → block diagram/schematic file 2 .v 调用 .bdf      将 .bdf 文件转换为 .v文件再调用 .v文件 ...

  7. WIN10剪切板打不开无法调用win+v无法打开

    1.确认设置-->剪切板设置-->剪切板打开 2.第一步打开之后仍然无法调用尝试第二步 管理员运行cmd-->输入以下命令 DISM /Online /Add-Capability ...

  8. c语言strcat_s用于调用的参数太少_为什么系统调用会消耗较多资源呢

    为什么这么设计(Why's THE Design)是一系列关于计算机领域中程序设计决策的文章,我们在这个系列的每一篇文章中都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点.对具体实现造成的影响 ...

  9. 调用系统相机和相册,并且裁剪成圆形图片(解决6.0,7.0,8.0版本问题)

    之前写过一篇博客,那篇博客对7.0手机裁剪图片的问题没有进行解决,现在对之前的那篇博客进行补充,解决了Android6.0,7.0,8.0版本问题,不仅可以调用相册,相机,还可以将图片保存到本地,并且 ...

最新文章

  1. C++——运算符的重载---以成员函数方式重载---以友元函数方式重载
  2. oracle如何降低逻辑读,如何降低该SQL的逻辑读
  3. VTK:可视化之ScalarBarActorColorSeries
  4. Retrofit与RXJava整合
  5. 计算机硬盘能达到5g的速度,5G号称可以达到几GB每秒,但是目前的手机处理器和硬盘可以处理这么庞大的数据量吗?...
  6. mysql 锁定表_MySQL表锁定
  7. 365RSS.cn = Web3.0?
  8. 供应XBF-01型多功存储介质粉碎机
  9. vue.js官方中文文档
  10. 以阿里云服务器为例理解docker端口映射
  11. html5 embed居中,HTML5标签embed详解
  12. 太湖之光超级计算机应用最高奖,“神威·太湖之光”两项应用入围“戈登·贝尔”奖...
  13. nmap扫描mysql弱口令_弱口令检测和端口扫描
  14. mixly for linux64,Mixly编程for Linux
  15. 微信小程序学习用demo:大写计算器;数字转换为大写
  16. Phonics 自然拼读法 sm sn sl sw sp st sc sk all ew y 小结与回顾
  17. 店铺推广前准备工作有哪些?
  18. 华为笔记本matebook13_华为MateBook 13酷睿i3版体验:极致的2K屏轻薄笔记本
  19. C#条型码二维码批量识别工具 可以从粘贴板获取图片或路径等 MFC消息示例
  20. 算法流程图组件的基本含义及画法举例(Kmeans)

热门文章

  1. 新浪微博如何设置半年可见?需要会员权限吗?
  2. 大连软交会开幕 人工智能成热点话题
  3. SCI论文投稿全程邮件模板
  4. MyBatis中日期时间的处理
  5. 国内云服务器,服务商优缺点分析
  6. UOS 1050e ARM架构(linux)安装TP-LINK TL-WN823N免驱版无线网卡驱动
  7. 长期表现决定了最终结果--leo看赢在中国第三季(8)大结局
  8. 调剂云南师范大学计算机专硕,云南师范大学2018年硕士研究生调剂公告
  9. P4V文件被独占checkout后的解锁操作
  10. 用Feed43为任意网站定制RSS feed教程~