为什么 MIPS 中 bgezal 和 bltzal 是基本指令而不是伪指令?

2024-03-10

根据这个MIPS指令参考 http://www.weblearn.hs-bremen.de/risse/RST/docs/MIPS/mips-isa.pdf,有两条指令(bgezal and bltzal),如果分支被采用,则执行相对跳转和链接,而不仅仅是相对跳转。

这些指令可以用一个模拟bgez or bltz分别,随后是jal,这意味着两者bgezal and bltzal应归类为伪指令。然而,两者都分配有操作码,因此它们被归类为基本指令。

将它们添加到基本指令集中而不是使它们成为伪指令的理由是什么?另外,为什么只有bgezal and bltzal包含在指令集中而不是,例如blezal, bgzal etc?


jal使用半绝对目标编码(替换PC的低28位),同时bgezal / bltzal是相对的(添加 18 位有符号位移,imm16<<2). 如何计算跳转目标地址和分支目标地址? https://stackoverflow.com/q/6950230

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

你可以编码bal(无条件相对函数调用)asbgezal $zero, target.

你可以得到$ra=PC与未采取的bltzal $zero, anywhere无需任何其他设置。这样做与bgezal需要一个小于零的输入寄存器,需要一个insn来创建。b...al指示always write $ra即使分支没有被占用。您希望将其用于与 PC 相关的代码,直到 MIPS32r6 给了我们addiupc为了更好地生成 PC 相关地址。

由于它们像其他指令一样使用 I 型指令格式branch 指令,一个寄存器的编码中有空间,因此将其设置为可选条件而不是just有一个bal操作说明。用于执行“与链接”的硬件逻辑已经存在,并且所有其他相关分支指令都是有条件的。另外,有一个不被接受的条件$zero方便阅读pc.

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

From http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html 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

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


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

MIPS b(无链接的无条件相对分支)也是一个伪指令beq $zero, $zero, target,或者由汇编器选择,对于bgez $zero, target. (无条件分支和无条件跳转(MIPS 中的指令)有什么区别? https://stackoverflow.com/questions/10981593/what-is-the-difference-between-unconditional-branch-and-unconditional-jump-inst/10982754#10982754)。米普斯R3000说明书 https://cgi.cse.unsw.edu.au/~cs3231/doc/R3000.pdf建议beq $zero,$zero。 (并且更清楚地证明$ra=PC无论分支如何,都会发生;从我最初撰写此答案时查看的快速参考表来看,这一点并不清楚。)

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 MIPS 中 bgezal 和 bltzal 是基本指令而不是伪指令? 的相关文章

随机推荐

  • Playstore 展示 Beta 标签床边制作应用

    前几天 我推广了我的测试版 open beta test 应用于生产 一切顺利 我可以在 Playstore 中搜索我的应用程序 但有一个问题 playstore没有删除 beta 我的应用程序名称旁边的标签 我想删除那个标签 我该怎么做或
  • ASP.NET MVC 单点登录和角色

    我使用类似于以下方法的内容跨 2 个 MVC 站点 称为 SiteA 和 SiteB 进行基本的单点登录 http forums asp net p 1023838 2614630 aspx http forums asp net p 10
  • Firefox 单选按钮怪异

    我有一个包含很多无线电组的表格 每个无线电都有一个唯一的 ID 并且与其组中的其他无线电具有相同的名称 该页面验证为 XHTML 过渡页面 在 IE6 和 7 Opera Safari 和 Chrome 中进行了测试 它的工作方式与您想象的
  • 领域驱动设计模式 - 从领域访问存储库

    我一直致力于将领域驱动设计模式应用到我们的 Web 应用程序中 我们遇到的问题之一是避免使用实体内的存储库 例如 我们有一些实体 其方法将触发电子邮件 因此 我们必须有权访问电子邮件模板 存储在数据库中 并在数据库队列表中创建新的电子邮件记
  • 顺序或并行启动存储过程

    我们有一个每晚运行的存储过程 进而启动许多其他过程 其中一些程序在逻辑上可以与其他一些程序并行运行 我如何向 SQL Server 指示一个过程应该并行运行还是串行运行 即 异步启动还是阻塞运行 并行运行它们会产生什么影响 请记住 我已经确
  • java 类在同一个包中找不到其他类

    我正在ubuntu中实现一个java程序 没有将货币转换为欧元的IDE 我有2个类ConvertiEuro和Valuta都在名为finanza的同一目录 包 中 当我尝试编译Valuta时 类ConvertiEuro使用类Valuta ja
  • SQL 差异的原因

    尽管存在 SQL 的 ANSI 标准 但为什么 SQL 发行版如此不标准 SQL 数据库的工作方式真的有那么多有意义的差异吗 还是只是我一直使用的两个数据库 MS SQL 和 PostgreSQL 为什么会出现这些差异 ANSI 标准仅指定
  • 如何检查VC++生成的二进制exe的运行时库类型

    用于对现有构建 二进制文件集 exe dll lib 进行故障排除 有没有办法使用 SDK 或其他实用程序中的命令行工具来快速检查目标文件编译时所针对的运行时库类型 例如 给定的 dll 显然是针对动态运行时编译的 但如果它是调试或发布版本
  • AngularJS $resource 使用方法时调用错误的 API URL:POST

    这不是最容易放入标题的问题 无论如何 我的应用程序是建立在nodejs expressjs并为 url 设置了 API 编辑 我当前使用的代码是 scope updateProduct resource api updateProduct
  • 如何禁用 ReactJs 的 laravel 路由

    我在 Laravel 上的应用程序中遇到了路由问题 因为我在 laravel 资源目录中使用 ReactJs 路由 使用 laravel 5 3 和最新的 React Js 资源 资产 js src Route js const route
  • 如何使用 libjpeg-turbo 编译 OpenCV?

    我在我的一个 C 项目中在 OS X Lion 上使用 OpenCV 2 3 1 虽然我的项目按原样运行得很好 但它很大程度上依赖于 JPEG 解码和编码 我想通过使用 libjpeg turbo 来获得加速 但我找不到与 libjpeg
  • C# 控制台应用程序中 public static void Main() 和 private static void Main() 有什么区别?

    有什么区别 public static void Main and private static void Main 在 C 控制台应用程序中 具体来说 因为它涉及Main 方法 我理解之间的区别public and private 要作为
  • 如何删除谷歌表格中带有标题的空列?

    我有下面的代码可以帮助我删除右端的所有空列 但我在工作表之间也有空列 并且所有这些空列都带有标题 我想删除带标题的空列 有人可以帮助我吗 function removeEmptyColumns var ss SpreadsheetApp g
  • 使用 f:param 传递参数时 f:ajax 不起作用

    我正在单击链接时调用一个方法 以下代码可以使用ajax方式工作
  • 如何使用 Grafana 和 Wamp 的 LDAP 身份验证进行单点登录?

    我正在尝试使用 LDAP 为 grafana 添加单点登录 我遇到过LDAP 的 Grafana 文档 http docs grafana org installation ldap 但我不明白 我可以使用 LDAP 获得单点登录功能吗 如
  • 使用 VSIX 部署包含项目模板 IWizard 的程序集

    我已经为 VS 2010 创建了一个部署项目模板的扩展 项目模板使用自定义向导 在特定程序集中 当我基于此模板创建新项目时会调用该向导 我想将包含向导的程序集打包在 VSIX 中 以便将其部署到模板可以找到它的地方 我知道 GAC 不是 V
  • 转换集合

    有一个对象的集合 示意图 A 1 B 1 A 1 B 2 A 2 B 3 A 2 B 4 A 1 B 5 A 3 B 6 Need A 1 Bs 1 2 A 2 Bs 3 4 A 1 Bs 5 A 3 Bs 6 可以这样 LINQ 吗 No
  • UITextView 触摸事件未触发

    我有一个UITextView我想检测一次点击 看起来我只需覆盖就可以了touchesEnded withEvent并检查 touches anyObject tapCount 1 但是这个事件甚至没有触发 如果我像这样重写 4 个事件 vo
  • 如何修复:预期具体生命周期,但发现绑定生命周期参数

    我目前正在听这个问题 我试图将其缩小到最小的可重现示例 struct Request struct ResponseWriter lt a gt dummy a deriving Clone pub struct RouteStore pu
  • 为什么 MIPS 中 bgezal 和 bltzal 是基本指令而不是伪指令?

    根据这个MIPS指令参考 http www weblearn hs bremen de risse RST docs MIPS mips isa pdf 有两条指令 bgezal and bltzal 如果分支被采用 则执行相对跳转和链接