为什么在MIPS中是bgezal&bltzal基本指令而不是伪指令? [英] Why are bgezal & bltzal basic instructions and not pseudo-instructions in MIPS?

查看:15
本文介绍了为什么在MIPS中是bgezal&bltzal基本指令而不是伪指令?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

根据this MIPS instruction reference,如果采用分支,则有两条指令(bgezalbltzal)执行相对跳转和链接,而不仅仅是相对跳转。

这些指令可以分别用bgezbltz模拟,后跟jal,这意味着bgezalbltzal都应该被归类为伪指令。但是,两者都有分配给它们的操作码,因此它们被归类为基本指令。

将它们添加到基本指令集中而不使其成为伪指令的理由是什么?还有,为什么指令集中只有bgezalbltzal,没有blezalbgzal等呢?

推荐答案

jal使用半绝对目标编码(替换PC的低28位),而bgezal/bltzal是相对的(添加18位带符号位移,imm16<<2)。How to Calculate Jump Target Address and Branch Target Address?

它们是经典的MIPS唯一的分支链接(而不是跳转链接),因此对于位置无关的可重定位代码非常重要。(与jal不同,您甚至可以使用它们将当前PC放入寄存器并找出执行位置)。

您可以将bal(无条件相对函数调用)编码为bgezal $zero, target

您可以使用Not-Takebltzal $zero, anywhere获得$ra=PC,而不需要任何其他设置。使用bgezal执行此操作需要一个小于零的输入寄存器,这将需要一个INSN来创建。b...al说明始终写入$ra,即使未采用分支也是如此。在MIPS32r6为我们提供addiupc以便更好地生成PC相对地址之前,您希望将此用于PC相对代码。

因为它们像其他b牧场指令一样使用I型指令格式,所以在一个寄存器的编码中有空间,所以有选择地使其具有条件是有意义的,而不是仅仅具有bal指令。执行"AND链接"的硬件逻辑已经存在,并且所有其他相关分支指令都是有条件的。此外,如果条件不是$zero,则阅读pc可能更方便。

请记住,在早期的MIPS硬件中,MIPS指令编码直接用作内部控制信号,因此它们之间不同的编码中的一位可能连接到XOR门,该门反转(或不反转)对符号位的检查。(正如Konrad的答案所指出的,这些分支条件仅取决于寄存器的MSB,因为它总是与零相对,因此不需要等待32位加法器产生比较结果。)

发件人http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html

0000 01ss sss1 0001 iiii iiii iiii iiii   BGEZAL
0000 01ss sss1 0000 iiii iiii iiii iiii   BLTZAL
指令编码缺乏灵活性(因为它直接驱动内部控制信号,而不需要在解码时进行太多转换),这可能是为什么不只有一个具有28位范围(从26位相对位移)的bal。相对分支的硬件设置为具有16位立即数的I型指令。


TL:DR:有2条条件分支链接指令,因为根据其中一条指令实现无条件bal是很自然的,而另一条指令几乎是免费的。

MIPSb(无链接的无条件相对分支)也是beq $zero, $zero, target的伪指令,或者根据汇编程序的选择,为bgez $zero, target执行。(What is the difference between unconditional branch and unconditional jump (instructions in MIPS)?)。MIPSR3000 manual提示beq $zero,$zero。(更清楚地说明,无论分支如何,$ra=PC都会发生;这在我最初撰写此答案时查看的快速参考表中并不清楚。)

比较到零编码只有一个5位寄存器字段,因此它们比beq/bne占用更少的编码空间。这可能是选择bgezal而不是beqal作为要提供的条件分支对之一的原因。

这篇关于为什么在MIPS中是bgezal&amp;bltzal基本指令而不是伪指令?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆