MIPS组装中J与JAL(以及JR与JALR)的必要性

时间:2016-12-16 01:23:25

标签: assembly mips cpu-architecture

我已注册,因为我一直在谷歌上搜索这个问题的答案而无法找到答案。

我想知道在MIPS中是否严格需要没有链接的跳转指令?

我可以想象例如使用" AL"不需要的版本会产生一些功率损失,但是有没有任何情况(那些不是完全做作或者可以相对简单地编码)只有J / JR可以工作?

谢谢!

1 个答案:

答案 0 :(得分:4)

  

将评论正式化为答案

J / JR可以使用JAL / JALR进行模拟,因为后者执行前者操作的超集。

正如@Jester指出的那样,例程(C行话中的函数)必须小心保存$ra中的返回地址。
除非例程是一个叶子例程(一个不进行任何调用的例程),$ra必须保存在某个地方。

实际上,JAL / JALRJ / 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 / JALRJ / JR的一条指令,因为它们固有的纠缠。

考虑到跳转和调用在典型程序中经常发生,因此能够轻松实现(并快速执行它们)对于任何成功的ISA都是必需的。