首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在MIPS中bgezal & bltzal基本指令不是伪指令?

为什么在MIPS中bgezal & bltzal基本指令不是伪指令?
EN

Stack Overflow用户
提问于 2013-12-19 11:13:12
回答 4查看 3.8K关注 0票数 4

根据此MIPS指令参考,有两个指令(bgezalbltzal)执行相对跳转和链接,而不是只执行相对跳转。

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

将它们添加到基本指令集而不使它们成为伪指令的理由是什么?另外,为什么指令集中只包括bgezalbltzal,而不包括blezalbgzal等?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-10-06 21:26:36

jal使用半绝对目标编码(取代低28位PC),而bgezal / bltzal是相对的(添加18位符号移位,imm16<<2)。如何计算跳跃目标地址和分支目标地址?

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

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

您可以在不需要任何其他设置的情况下,使用未获取的$ra=PC bltzal $zero, anywhere 来获得,而使用bgezal进行此操作则需要一个不超过零的输入寄存器,这将需要一个输入寄存器来创建。即使不使用分支,b...al指令也总是写入$ra。你想要这样做的PC相对代码,直到MIPS32r6给我们addiupc更好的PC相对地址生成。

由于它们与其他b牧场指令一样使用i型指令格式,所以在编码中有一个寄存器的空间,因此有意义的是让它具有可选的条件,而不是仅仅有一个bal指令。执行“和链接”的硬件逻辑已经存在,所有其他相关分支指令都是有条件的。另外,对于$zero来说,有一个不被接受的条件对于阅读pc是很方便的。

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

来自http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html

代码语言:javascript
运行
复制
0000 01ss sss1 0001 iiii iiii iiii iiii   BGEZAL
0000 01ss sss1 0000 iiii iiii iiii iiii   BLTZAL

这种指令编码缺乏灵活性(因为它直接驱动内部控制信号,而不需要在解码中进行大量转换)也许就是为什么不存在一个28位范围的单一bal (相对位移为26位)。相关分支的硬件是为具有16位即时性的I型指令设置的。

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

MIPS b (无条件的无链路相对分支)也是beq $zero, $zero, target的伪指令,或由汇编程序选择的bgez $zero, target指令。(无条件分支和无条件跳转有什么区别(MIPS中的指令)?)。MIPS R3000手册建议使用beq $zero,$zero。(更清楚的是,无论分支如何,$ra=PC都会发生;这一点从我最初写这个答案时看到的快速参考单中还不清楚。)

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

票数 5
EN

Stack Overflow用户

发布于 2013-12-19 11:38:15

bgez和bltz不是伪指令。

bgezal和bltzal是一样的,这并不奇怪。

虽然是RISC,但并不是所有的指令都应该是基本的。如果经常使用,两个指令需要更多的内存和更多的时间,而且操作码中有很大的空间,为什么不将它们组合成一个呢?

票数 1
EN

Stack Overflow用户

发布于 2013-12-22 04:50:59

主要原因是效率。

您最初的假设(执行bgez后接jal可以由beqzal模拟或功能等效于执行beqzal)是正确的,但这样做的效率可能较低。

为什么一开始就存在伪指令?马里兰大学关于伪指令分枝的注释解释了这一点。答案在于MIPS的设计方式。MIPS是一个精简的指令集。如果速度有明显的提高,指令可以留在ISA中。如果它可以使用两个或更多的指令编写,而没有明显的延迟(因为它们没有经常使用),那么这些指令就没有包含在MIPS ISA中。相反,它们变成了伪指令。

让我们采取另一个伪指令,如la,或加载地址。la是一个伪指令,可以分解为lui指令和ori指令。在32位MIPS架构上,每条指令以及每个寄存器的大小都是32位.因此,为了存储32位地址,使用了两个指令。有关la指令的更多信息可以找到这里

bgezalbltzal指令不太可能是psudo指令,因为在一条指令中执行完整操作更有效。硬件必须能够执行条件检查,跳转到分支地址,并将返回地址存储在一条指令中。如果jal指令被分离,这不仅是对空间的不必要的使用,而且在某些硬件实现中,这个额外的指令可能会通过处理器的数据路径消耗一个执行周期,从而有效地减缓程序的执行速度。

其他来源:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20680218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档