为什么在MIPS中是bgezal&;bltzal基本指令而不是伪指令? [英] Why are bgezal & bltzal basic instructions and not pseudo-instructions in MIPS?
问题描述
根据this MIPS instruction reference,如果采用分支,则有两条指令(bgezal
和bltzal
)执行相对跳转和链接,而不仅仅是相对跳转。
bgez
或bltz
模拟,后跟jal
,这意味着bgezal
和bltzal
都应该被归类为伪指令。但是,两者都有分配给它们的操作码,因此它们被归类为基本指令。
将它们添加到基本指令集中而不使其成为伪指令的理由是什么?还有,为什么指令集中只有bgezal
和bltzal
,没有blezal
、bgzal
等呢?
推荐答案
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
可能更方便。
发件人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
都会发生;这在我最初撰写此答案时查看的快速参考表中并不清楚。)
beq
/bne
占用更少的编码空间。这可能是选择bgezal
而不是beqal
作为要提供的条件分支对之一的原因。
这篇关于为什么在MIPS中是bgezal&;bltzal基本指令而不是伪指令?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!