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

Col*_*-Wu 2 assembly mips cpu-architecture

我注册是因为我一直在谷歌上搜索这个问题的答案,但找不到。

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

例如,我可以想象,在不需要时使用“AL”版本会导致一些功率损失,但是有没有任何情况(这不是完全人为设计的或者可以相对简单地编码)只有 J/JR 可以工作?

谢谢!

Mar*_*oom 5

将评论形式化为答案


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

正如@Jester 指出的那样,例程(C 术语中的函数)必须小心地将它们的返回地址保留在$ra.
除非例程是叶例程(不执行任何调用的例程),$ra否则必须将其保存在某处。

实际上,JAL/JALRJ/JR都可以通过另一个来实现:

  • 模拟JAL/JALRJ/JR

    Original               Emulated
    
    jal foo                la $ra, ret_label
                           j foo
                          ret_label:
    
    Run Code Online (Sandbox Code Playgroud)
  • 模拟J/JRJAL/JALR

    Original                Emulated
    
    j foo                   prolog:
                              addi $sp, $sp, -4
                              sw $ra, ($sp)   
    
                              jal foo
    
                            epilog:
                              lw $ra, ($sp)
                              addi $sp, $sp, 4
    
    Run Code Online (Sandbox Code Playgroud)

    为此,代码必须返回到epilog. 假设$ra大部分保留在例程中(因此是标签的名称)。非常感谢@EOF 指出此代码段中的错误。

正如@Peter 指出的那样,访问$pc导致更容易(对人类)模拟JAL/ JALR

正如@EOF 指出的那样,考虑到它们与生俱来的纠缠,一些 RISC 机器实际上只有一条JAL/JALRJ/指令JR

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

  • @ColinWeltin-Wu:明确区分函数调用和跳转还有另一个方面:函数调用向处理器提供了关于*未来跳转*的额外信息(即被调用函数的“返回”)。如果没有这些信息,`return` 是一个相当昂贵的操作,因为它是一个绝对分支,这意味着 * 分支目标预测 * 被涉及。OTOH,如果处理器保持一个小的硬件返回地址堆栈,分支目标是提前知道的,允许预取和流水线。 (2认同)