Col*_*-Wu 2 assembly mips cpu-architecture
我注册是因为我一直在谷歌上搜索这个问题的答案,但找不到。
我想知道 MIPS 中是否严格需要没有链接的跳转指令?
例如,我可以想象,在不需要时使用“AL”版本会导致一些功率损失,但是有没有任何情况(这不是完全人为设计的或者可以相对简单地编码)只有 J/JR 可以工作?
谢谢!
将评论形式化为答案
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:
Run Code Online (Sandbox Code Playgroud)模拟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
Run Code Online (Sandbox Code Playgroud)
为此,代码必须返回到epilog. 假设$ra大部分保留在例程中(因此是标签的名称)。非常感谢@EOF 指出此代码段中的错误。
正如@Peter 指出的那样,访问$pc导致更容易(对人类)模拟JAL/ JALR。
正如@EOF 指出的那样,考虑到它们与生俱来的纠缠,一些 RISC 机器实际上只有一条JAL/JALR和J/指令JR。
考虑到跳转和调用在典型程序中经常发生,对于任何成功的 ISA 来说,能够轻松实现(并快速执行它们)是必不可少的。