我已注册,因为我一直在谷歌上搜索这个问题的答案而无法找到答案。
我想知道在MIPS中是否严格需要没有链接的跳转指令?
我可以想象例如使用" AL"不需要的版本会产生一些功率损失,但是有没有任何情况(那些不是完全做作或者可以相对简单地编码)只有J / JR可以工作?
谢谢!
答案 0 :(得分:4)
将评论正式化为答案
J
/ JR
可以使用JAL
/ JALR
进行模拟,因为后者执行前者操作的超集。
正如@Jester指出的那样,例程(C行话中的函数)必须小心保存$ra
中的返回地址。
除非例程是一个叶子例程(一个不进行任何调用的例程),$ra
必须保存在某个地方。
实际上,JAL
/ JALR
和J
/ JR
可以实现另一个:
使用JAL
/ JALR
J
/ JR
Original Emulated
jal foo la $ra, ret_label
j foo
ret_label:
使用J
/ JR
JAL
/ JALR
Original Emulated
j foo prolog:
addi $sp, $sp, -4
sw $ra, ($sp)
jal foo
epilog:
lw $ra, ($sp)
addi $sp, $sp, 4
为此,代码必须返回epilog
。假设$ra
主要保留在例程中(因此标签的名称)。
非常感谢@EOF在这个片段中指出了一个错误。
正如@Peter所指出的,对$pc
的访问导致JAL
/ JALR
更容易(对于人类)仿真。
正如@EOF指出的那样,一些RISC机器实际上只有JAL
/ JALR
和J
/ JR
的一条指令,因为它们固有的纠缠。
考虑到跳转和调用在典型程序中经常发生,因此能够轻松实现(并快速执行它们)对于任何成功的ISA都是必需的。