【问题标题】:Overflow in "addi" instruction of MIPS - ExamplesMIPS 的“addi”指令溢出 - 示例
【发布时间】:2013-02-23 02:28:22
【问题描述】:

我意识到 addi 指令会导致溢出异常。我目前正在使用 Bluespec HDL 来模拟导致异常的处理器并适当地处理它们。

无论如何,我正在编写一些测试用例来触发溢出异常,特别是使用 MIPS 的 addi 命令。

注意:我正在测试的处理器是基于 SMIPS 的,但我支持一些 MIPS 指令用于异常和中断等目的。

我知道我检测溢出的逻辑是正确的(下面的伪代码):

if (function == Addi) begin
  if(( a < 0 && b < 0 && result >= 0) || (a >0 && b > 0 && result < 0))
    return True;
  else 
   return False;
end

问题:什么是溢出的例子:我正在尝试以下方法:(使用__asm__ 的内联汇编)

 addi $2, $0, 0x7fff
 addi $3, $2, 0x000f

这不会引发异常。如果我试试这个:

 addi $2, $0, 0x7fffffff
 addi $3, $2, 0x0000000f

我收到一个汇编错误,因为立即数必须是 16 位。我怎样才能从 andi 获得溢出?你能给我举个很好的例子吗...我需要使用其他指令来填充高位吗?

谢谢

【问题讨论】:

    标签: assembly mips inline-assembly bluespec


    【解决方案1】:

    您的第一个序列不会导致溢出异常,因为寄存器是 32 位的。 32767 + 15 = 32782,在 32 位以内。

    您不能在 MIPS 中的单个指令中加载大立即数。先用 LUI 指令加载高 16 位,再用 ADDI(或 ORI,或 XORI)加载低 16 位。

    您还可以 LW 从内存中带入一个 32 位值。

    【讨论】:

    • 我对汇编不是很熟悉,请你举个例子。谢谢
    • 我不明白您如何使用 HDL、模拟处理器以及编写实现溢出检测的代码,但您无法理解汇编指令。
    • 好吧。我是测试处理器架构项目的一部分。 Bluespec 是一种非常高级的思维方式,您只需定义规则以流水线处理处理器,而无需了解组装细节。别管我之前的问题,我明白你的意思。
    • 另外,这是对类的支持。我早些时候上过这门课,现在我正试图为与教授一起工作的处理器获得异常支持。这门课深入到 bluespec 和处理器设计,根本不介绍组装!呵呵
    • 谢谢。我刚刚打开它来检查 lui 指令。
    猜你喜欢
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2011-10-03
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    相关资源
    最近更新 更多