libra811 发表于 2009-12-08 14:09

mips中返回地址寄存器的问题

看《see mips run》中有这么一段话
$31为返回地址寄存器。
与返回地址保存在堆栈中相比,保存到$31中显得不是很灵活。但是有一些好出。
首先,它可以使分支指令和内存访问指令保持很好的独立性;
其次,当调用那些根本就不需把返回地址保存在堆栈中的小程序时,它可以提高程序效率。

这两个好处谁能帮忙解释一下,谢谢

readkernel 发表于 2009-12-17 18:03

其次,当调用那些根本就不需把返回地址保存在堆栈中的小程序时,它可以提高程序效率。

直接在从$31拿返回地址当然更快,因为不需要访问总线和内存。

readkernel 发表于 2009-12-17 18:05

arm、powerpc也都有这样一个寄存器,可以说这是RISC的一个特性吧

bukaihua 发表于 2009-12-17 22:12

“其次”被2楼解释了;
“首先”是因为分支目标在寄存器里就不需要访存了。

zuxy 发表于 2009-12-18 16:34

回复 #1 libra811 的帖子

这样理解第一点:
RISC 的一个原则就是只用 ld 和 st 两条指令访问内存,从而简化硬件设计。如果我们将返回地址放在堆栈中,那么函数调用 jal 和返回 jr 就都得访问内存,这就与 RISC 的原则相违背了。

这样理解第二点:
“小函数”是个不准确的翻译,原意应当是“叶函数”,也就是不调用其他函数的函数。因为这样的函数不调用其他函数,也就没有必要保存 $31,从而比把返回地址放在堆栈中的方法减少了两次内存访问。

事实上第二点中的条件不是必要的。将返回地址放在寄存器里总是能减少内存访问的,不管是不是在叶函数中。

libra811 发表于 2010-01-15 11:03

多谢各位的回复!
页: [1]
查看完整版本: mips中返回地址寄存器的问题