我注册了,因为我一直在谷歌上搜索这个问题的答案,但找不到。
我想知道在MIPS中没有链接的跳转指令是不是绝对必要的?
例如,我可以想象,在不需要的时候使用"AL“版本会导致一些功率损失,但是有没有什么情况(这不是完全人为的,或者可以相对简单地编码),只有J/JR可以工作?
谢谢!
发布于 2016-12-16 18:37:24
将注释正式化为答案
J/JR可以用JAL/JALR模拟,因为后者执行前者的操作的超集。
正如@Jester所指出的,例程(C行话中的函数)必须小心地保留它们在$ra中的返回地址。
除非例程是叶例程(不做任何调用的例程),否则$ra必须保存在某个地方。
实际上,JAL/JALR和J/JR都可以相互实现:
J/JR模拟JAL/JALR原始模拟日航foo la $ra,ret_label j foo ret_label:
J/JR,带JAL/JALR原始仿真j prolog: addi $sp,$sp,-4 \f25 sw $ra,($sp) -4\f25 jal foo -4\f6结尾: lw $ra,($sp) addi $sp,$sp,4.
要使其正常工作,代码必须返回到epilog。假设$ra主要保存在例程中(因此有标签的名称)。非常感谢@EOF指出了这段代码中的一个错误。
正如@Peter指出的那样,对$pc的访问使得(对人类而言)更容易模拟JAL/JALR。
正如@EOF指出的,一些RISC机器实际上只有一条用于JAL/JALR和J/JR的指令,因为它们天生就是纠缠的。
考虑到跳转和调用在典型程序中经常发生,对于任何成功的ISA来说,能够轻松地实现(并快速执行它们)是必需的。
https://stackoverflow.com/questions/41175942
复制相似问题