【问题标题】:What type is the break instruction on MARS (MIPS Assembly)MARS(MIPS汇编)上的break指令是什么类型
【发布时间】:2019-04-10 19:35:16
【问题描述】:

我正在写一篇关于编程语言演变的文章,并在 MIPS 汇编中编写了一个小程序,用于计算前 100 个素数。该程序的(伪)指令之一是“rem $t3, $t0, $t2”,它被转换为以下四个本机指令:

bne $10, $0, 0x00000001
break
div $8, $10
mfhi$11

我以前从未注意到中断指令,所以我到处搜索,几乎找不到任何关于中断指令或其类型的提及。

我能找到的仅有的两个文档,其中this one 将“break”声明为调试器使用的指令,this other one 将“break”声明为包含三个部分的指令:特殊(6 位)、代码( 20 位)和中断(6 位),但它没有提及该指令的类型。它肯定不是 R、I 或 J 型。

所以我想知道:

  1. 中断指令是 MIPS ISA 的一部分还是仅是一条指令 MARS 能识别吗?
  2. break指令的指令类型是什么?
  3. 它如何将控制权转移到硬件中的异常处理程序?
  4. 它会改变程序计数器 (PC) 寄存器吗?

【问题讨论】:

  • 机器码字的数值是多少?我忘记了 MARS 是否很容易向您显示,但如果不是,您可以在上面贴上标签并 lw 代码字。
  • 操作码为 0x00。是的,MARS 显示每条指令的十六进制值。

标签: assembly mips mars-simulator


【解决方案1】:

根据MIPS32™ 程序员架构第一卷:MIPS32™ 架构简介,只有 R-Type 格式具有function 字段。 BREAK 有一个 function 字段,因此它是一个 R-Type 指令。

由于BREAK 指令不接受任何操作数,因此它不会为此目的使用位 6..25。这并不是那么不寻常。例如,SLL 不使用 rs 字段,因此这些位设置为零,MULT 不使用 rdsa 字段,因此所有这些位都是设置为零。

至于会发生什么:CP0 寄存器 13 (Cause) 中的相关位将被设置以指示由于命中断点而发生异常。然后将控制权转移到某个固定地址的异常处理程序代码。

【讨论】:

  • 谢谢迈克尔,我没有机会学习太多协处理器,所以我想现在这是一个很好的机会。我下载了面向程序员的 MIPS32™ 架构的第 I、II 和 III 卷。如果你碰巧有更多这方面的资源,请分享:)谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
相关资源
最近更新 更多