【问题标题】:Necessity of J vs. JAL (and JR vs. JALR) in MIPS assemblyMIPS 组装中 J 与 JAL(以及 JR 与 JALR)的必要性
【发布时间】:2016-12-16 01:23:25
【问题描述】:

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

我想知道没有链接的跳转指令在 MIPS 中是否是绝对必要的?

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

谢谢!

【问题讨论】:

  • 它们不是绝对必要的,但您必须小心保留$ra
  • 如果您可以通过其他方式将地址输入$ra 来模拟 JAL,那么您就不需要它。但我不太了解 MIPS,不知道是否有 PIC 方法可以做到这一点。
  • C 有 goto 语句,它看起来像 J 指令。 breakcontinue 声明也可能对此有发言权。
  • 在 RISC-V 上,跳转和链接指令指定一个目标寄存器(而不是始终使用 $ra)。要跳转链接,只需使用零寄存器作为目的地。

标签: assembly mips cpu-architecture


【解决方案1】:

将 cmets 形式化为答案


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

正如@Jester 所指出的,例程(C 行话中的函数)必须小心保留它们在$ra 中的返回地址。
除非该例程是叶例程(不进行任何调用)$ra 无论如何都必须保存在某个地方。

实际上JAL/JALRJ/JR 都可以按照另一个来实现:

  • J/JR模拟JAL/JALR

    Original               Emulated
    
    jal foo                la $ra, ret_label
                           j foo
                          ret_label:
    
  • JAL/JALR模拟J/JR

    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 指出这个 sn-p 中的一个错误。

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

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

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

【讨论】:

  • J/JR 的模拟不起作用,因为控制流不会返回,因此此代码不会撤消堆栈调整。尽管如此,+1。
  • @EOF 是的,当然!脑残。我的意思是 1) 保存 $ra 2) 使用 jal/jalr 进行跳跃 3) 恢复 $ra。固定答案。谢谢
  • 是的,基本上只是把这个函数当作一个非叶函数,不管它是否真的一个叶函数。
  • 谢谢,这很有意义。为了更进一步,我很好奇删除一对与另一对在代码大小/速度方面的影响。
  • @ColinWeltin-Wu:明确区分函数调用和跳转还有另一个方面:函数调用向处理器提供了有关未来跳转的额外信息(即return 来自被调用函数)。没有这些信息,return 是一个相当昂贵的操作,因为它是一个绝对分支,这意味着 branch target prediction 参与其中。 OTOH,如果处理器保留一个小的返回地址硬件堆栈,则可以提前知道分支目标,从而允许预取和流水线操作。
猜你喜欢
  • 1970-01-01
  • 2020-02-05
  • 2020-03-27
  • 1970-01-01
  • 2020-05-11
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多