|
|
|
|
移动端

2.2.6 简洁的子程序调用

《手把手教你设计CPU——RISC-V处理器篇》第2章大道至简——RISC-V架构之魂,本章将对RISC-V架构的设计思想进行深入浅出的介绍。本节为大家介绍简洁的子程序调用。

作者:胡振波来源:人民邮电出版社|2018-05-23 13:16

技术沙龙 | 邀您于8月25日与国美/AWS/转转三位专家共同探讨小程序电商实战

2.2.6 简洁的子程序调用

为了理解此节,需先对一般RISC架构中程序调用子函数的过程予以介绍,其过程如下。

进入子函数之后需要用存储器写(Store)指令来将当前的上下文(通用寄存器等的值)保存到系统存储器的堆栈区内,这个过程通常称为“保存现场”。

在退出子程序时,需要用存储器读(Load)指令来将之前保存的上下文(通用寄存器等的值)从系统存储器的堆栈区读出来,这个过程通常称为“恢复现场”。

“保存现场”和“恢复现场”的过程通常由编译器编译生成的指令完成,使用高层语言(例如C语言或者C++)开发的开发者对此可以不用太关心。高层语言的程序中直接写上一个子函数调用即可,但是这个底层发生的“保存现场”和“恢复现场”的过程却是实实在在地发生着(可以从编译出的汇编语言里面看到那些“保存现场”和“恢复现场”的汇编指令),并且还需要消耗若干的CPU执行时间。

为了加速“保存现场”和“恢复现场”的过程,有的RISC架构发明了一次写多个寄存器到存储器中(Store Multiple),或者一次从存储器中读多个寄存器出来(Load Multiple)的指令。此类指令的好处是一条指令就可以完成很多事情,从而减少汇编指令的代码量,节省代码的空间大小。但是“一次读多个寄存器指令”和“一次写多个寄存器指令”的弊端是会让CPU的硬件设计变得复杂,增加硬件的开销,也可能损伤时序,使得CPU的主频无法提高,作者曾经设计此类处理器时便深受其苦。

RISC-V架构则放弃使用“一次读多个寄存器指令”和“一次写多个寄存器指令”。如果有的场合比较介意“保存现场”和“恢复现场”的指令条数,那么可以使用公用的程序库(专门用于保存和恢复现场)来进行,这样就可以省掉在每个子函数调用的过程中都放置数目不等的“保存现场”和“恢复现场”的指令。此选择再次印证了RISC-V追求硬件简单的哲学,因为放弃“一次读多个寄存器指令”和“一次写多个寄存器指令”可以大幅简化CPU的硬件设计,对于低功耗小面积的CPU可以选择非常简单的电路进行实现;而高性能超标量处理器由于硬件动态调度能力很强,可以有强大的分支预测电路保证CPU能够快速地跳转执行,从而可以选择使用公用的程序库(专门用于保存和恢复现场)的方式减少代码量,同时达到高性能。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

实时UML与Rational Rose RealTime建模案例剖析

本书将实时系统、实时统一建模语言、实时系统的统一开发过程和Rational Rose RealTime建模环境有机地结合起来,以案例为基础,系统地介绍了...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊