当前位置:网站首页>RISC-V调用惯例
RISC-V调用惯例
2022-07-30 14:48:00 【霍宏鹏】
寄存器惯例

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,32
0x0000000000010160 <+8>: li a5,1
0x0000000000010162 <+10>: sw a5,-20(s0)
0x0000000000010166 <+14>: li a5,2
0x0000000000010168 <+16>: sw a5,-24(s0)
0x000000000001016c <+20>: lw a4,-20(s0)
0x0000000000010170 <+24>: lw a5,-24(s0)
0x0000000000010174 <+28>: addw a5,a5,a4
0x0000000000010176 <+30>: sw a5,-28(s0)
0x000000000001017a <+34>: lw a5,-28(s0)
0x000000000001017e <+38>: mv a1,a5
0x0000000000010180 <+40>: lui a5,0x1c
0x0000000000010182 <+42>: addi a0,a5,176 # 0x1c0b0
0x0000000000010186 <+46>: jal ra,0x10332 <printf>
0x000000000001018a <+50>: li a5,0
0x000000000001018c <+52>: mv a0,a5
0x000000000001018e <+54>: ld ra,24(sp)
0x0000000000010190 <+56>: ld s0,16(sp)
0x0000000000010192 <+58>: addi sp,sp,32 #用完以后恢复
0x0000000000010194 <+60>: ret
End of assembler dump.
边栏推荐
猜你喜欢

71页全域旅游综合整体解决方案2021 ppt

Mac 中 MySQL 的安装与卸载

GUCCI、LV等奢侈品巨头如何布局元宇宙的,其他品牌应该跟上吗?

Smart Contract Security - Private Data Access

canal抓取数据

SLF4J的使用

JUC常见的线程池源码学习 02 ( ThreadPoolExecutor 线程池 )

自动化办公|办公软件和亿图脑图MindMaster快捷键
![[Cloud Native] Service Industry Case - Solutions for Unpredictable Concurrency Scenarios](/img/c7/3faa29dc374e2e16e59ac9b8ebf249.png)
[Cloud Native] Service Industry Case - Solutions for Unpredictable Concurrency Scenarios

(Crypto essential dry goods) Detailed analysis of the current NFT trading markets
随机推荐
异常情况处置方案
Ts是什么?
postgresql的普通字符串和转义字符串
JSON common annotations
What is Ts?
JVM性能调优
71页全域旅游综合整体解决方案2021 ppt
Normal and escaped strings for postgresql
定时任务 corn
MongoDB starts an error Process: 29784 ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=14)
MongoDB启动报错 Process: 29784 ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=14)
B+树索引页大小是如何确定的?
编译、链接 - 笔记 - 3
Get the Google Advertising ID as a unique identifier
JVM performance tuning
4位资深专家多年大厂经验分享出Flink技术内幕架构设计与实现原理
ToDesk版本更新,引入RTC传输技术,是否早以替代向日葵远程控制?
MongoDB starts an error Process: 29784 ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=14)
自动化办公|办公软件和亿图脑图MindMaster快捷键
延时消息队列