RISC-V规范v2.2(JAL指令,第15页)说"标准调用约定":
标准软件调用约定使用x1作为返回地址寄存器,x5作为备用链接寄存器.
以下设计评论:
备用链接寄存器支持调用毫代码例程(例如,用于在压缩代码中保存和恢复寄存器的例程),同时保留常规返回地址寄存器.
什么是替代链接注册?
据我所知,"链接寄存器"是一个寄存器,用于存储pc在返回时跳转到,并且该millicode/microcode是低于ISA级别的低级指令格式.这个想法x5是用来代替x1围绕"正常调用"的某些(微代码/毫字节)指令来避免寄存器改组或溢出吗?你有一个典型的用法例子吗?
它可帮助的替代链接寄存器的说明添加到维基百科的文章链接寄存器,这是我去寻找额外的信息.
一般来说,millicode指令不应与正常指令相交,并且需要一个替代的调用约定来调用millicode过程(来自Waterman博士论文,第66页):
...例程必须具有备用调用约定,因为链接寄存器必须在执行期间保留.幸运的是,与ARM和MIPS不同,RISC-V的跳转和链接指令可以将返回地址写入任何整数寄存器,而不是破坏ABI指定的链接寄存器.除了这种区别之外,这些毫代程序的行为与普通程序相似
一个更具体的原因,为什么链接寄存器应该被保留,是因为millicode用于实现序言和结尾,因此使用常规调用约定将破坏链接寄存器并且将破坏使用millicode进行序言/结尾的整个想法.
是否使用x5而不是x1用于围绕"正常调用"的某些(微代码/毫字节)指令以避免寄存器改组或溢出?
是的......在某种程度上"环绕"这个词.
你有一个典型的用法例子吗?
见prologue_2,epilogue_2从毫例程沃特曼的博士,第67页
00: c919 c.beqz a0, 16
02: 016002ef jal t0, prologue_2
06: 842a c.mv s0, a0
08: 157d c.addi a0, -1
0a: ff7ff0ef jal ra, factorial
0e: 02850533 mul a0, a0, s0
12: 0100006f jal x0, epilogue_2
16: 4505 c.li a0, 1
18: 8082 c.jr ra
Run Code Online (Sandbox Code Playgroud)
其中prologue_2:
00: 1141 c.addi sp, -16
02: e406 c.sdsp ra, 8(sp)
04: e022 c.sdsp s0, 0(sp)
06: 8282 c.jr t0
Run Code Online (Sandbox Code Playgroud)
并且epilogue_2:
00: 60a2 c.ldsp ra, 8(sp)
02: 6402 c.ldsp s0, 0(sp)
04: 0141 c.addi sp, 16
06: 8082 c.jr ra
Run Code Online (Sandbox Code Playgroud)