根据此MIPS指令参考,有两条指令(bgezal和
bltzal)在执行分支时执行相对跳转和链接,而不仅仅是相对跳转。
这些指令可以分别用
bgez
或bltz
模拟,后跟jal
,这意味着bgezal
和bltzal
都应归类为伪指令。但是,两者都分配了操作码,因此它们被归类为基本指令。
将它们添加到基本指令集而不是使它们成为伪指令的理由是什么?此外,为什么指令集中只包含
bgezal
和bltzal
而不包括,例如blezal
、bgzal
等?
将它们添加到基本指令集而不是使它们成为伪指令的理由是什么?
仅仅因为一条指令可以分成几部分并不意味着它应该是这样的。我知道这是一个RISC,但在指令集的大小和整个系统的性能之间仍然需要权衡。
两条指令意味着比一条指令更长的执行时间,因此设计团队可能在看到它对流行基准测试的影响后决定包含这条指令。
此外,为什么指令集中只包括bgezal和bltzal,而不包括blezal、bgzal等?
对此我可以给出的最简单的解释是这些指令最容易实现:对于bgezal
和bltzal
,只需要检查符号位。
bgez和bltz不是伪指令。
bgezal和bltzal是一样的,这并不奇怪。
虽然是RISC,但并非所有指令都应该是基本指令。如果经常使用,两条指令需要更多内存,可能需要更多时间,而且操作码中有很多空间,为什么不将它们合并为一条呢?
jal
使用半绝对目标编码(替换PC的低28位),而bgezal
/bltzal
是相对的(添加18位有符号位移,im16
它们是经典MIPS唯一的分支和链接(而不是跳转和链接),因此对于位置无关的可重定位代码非常重要。(您甚至可以使用它将当前电脑放入寄存器,并找出执行的位置,这与jal不同)。
您可以将bal(无条件相对函数调用)编码为bgezal$零,target
。
您可以使用未获取的bltzal$零,任何地方
获取$ra=PC
,而无需任何其他设置。使用bgezal
执行此操作需要一个小于零的输入寄存器,该寄存器需要一个insn来创建。b... al
指令始终编写$ra
,即使没有使用分支。您希望PC相关代码使用此功能,直到MIPS32r6为我们提供了addupc
以更好地生成PC相关地址。
由于它们像其他分支指令一样使用I-type指令格式,因此在一个寄存器的编码中有一定的空间,因此有必要将其设置为有条件的,而不仅仅是有一条bal指令。执行“和链接”的硬件逻辑已经存在,所有其他相关分支指令都是有条件的。另外,有一个不适用于零美元的条件可以方便阅读电脑。
请记住,在早期的MIPS硬件中,MIPS指令编码直接用作内部控制信号,因此它们之间的编码中的一位可能会连接到异或门,该异或门反转(或不反转)对符号位的检查。(正如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
,而另一个几乎是免费的。
MIPS(无条件相对分支,无链接)也是一条伪指令,用于beq$zero,zero,target,或由汇编程序选择,用于bgez$zero,target。(无条件分支和无条件跳转(MIPS中的指令)之间的区别是什么?)。MIPS R3000手册建议0美元,0美元。(更清楚地说明,无论分支如何,都会发生$ra=PC;这在我最初撰写此答案时查看的快速参考表中并不清楚。)
比较零编码只有一个5位寄存器字段,因此它们比beq
/bne
消耗更少的编码空间。这可能是选择bgezal
而不是beqal
作为要提供的一对条件分支之一的原因。
Blade是无意间起的一个名字,始于 2015 年 9 月,目的为个人开发者提供一个除 Spring 系列框架的一个选择。 学习 Blade 搭建 Web 程序,只需要 1 小时,如果你是一个Web开发的老手,也许20分钟就够了。 Blade 是什么? 一个高效的 MVC 开发框架 是一个自带WebServer的库 帮助开发者快速构建Web程序 源代码不到 500KB 的开源框架 简洁优雅的 AP
Bootstrapping(引导) 是 Netty 中配置程序的过程,当你需要连接客户端或服务器绑定指定端口时需要使用 Bootstrapping。 如前面所述,Bootstrapping 有两种类型,一种是用于客户端的Bootstrap,一种是用于服务端的ServerBootstrap。不管程序使用哪种协议,无论是创建一个客户端还是服务器都需要使用“引导”。 面向连接 vs. 无连接 请记住,这
问题内容: 什么是反射,为什么有用? 我对Java特别感兴趣,但是我认为原理在任何语言中都是相同的。 问题答案: 名称反射用于描述能够检查同一系统(或本身)中的其他代码的代码。 例如,假设您在Java中有一个未知类型的对象,并且想在该对象上调用“ doSomething”方法(如果存在)。除非对象符合已知的接口,否则Java的静态类型化系统并不是真正为支持该类型而设计的,但是使用反射,您的代码可以
问题内容: 我了解JSON,但不了解JSONP。Wikipedia上有关JSON的文档是JSONP的最高搜索结果。它说: JSONP或“带填充的JSON”是JSON扩展,其中将前缀指定为调用本身的输入参数。 ??什么电话 这对我来说毫无意义。JSON是一种数据格式。没有电话 在第二个搜索结果是由某些人叫雷米,谁写的这个约JSONP: JSONP是脚本标记注入,它将响应从服务器传递到用户指定的函数。
问题内容: 我经常在PHP中看到包含include.inc文件的示例。.inc是什么意思?它的作用是什么?使用它的缺点和优点是什么? 问题答案: 它没有任何意义,只是一个文件扩展名。如果扩展名是.inc的文件被设计为包含在其他PHP文件中,这是某些人的惯例,但这只是惯例。 它确实存在一个可能的缺点,即通常没有将服务器配置为将.inc文件解析为php,因此,如果该文件位于您的Web根目录中,并且您的
本文向大家介绍GC是什么? 为什么要有GC?相关面试题,主要包含被问及GC是什么? 为什么要有GC?时的应答技巧和注意事项,需要的朋友参考一下 答 GC(Garbage Collection) GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一: 当程序需要更多的堆空间时,GC需要进行垃圾清理工作,暂停所有线程,找出所有无被引用的对象,进