【问题标题】:Translating a mips pseudo instruction 'rol'翻译 mips 伪指令 'rol'
【发布时间】:2014-07-02 23:26:25
【问题描述】:

我正在尝试翻译 mips 伪指令 rol(向左旋转)。我需要先翻译它,然后才能提交作业,这很不幸,因为伪指令对我来说效果很好。

指令是,

      rol   $s4,$s4, 1  #goes to the left most bit (which as it says, gets the left most bit)

我是这样翻译的,

       lui $s4, 0x8001     
       ori $t0, $s4, 0x0004
       srl $s4, $t0, 31
       sll $s5, $t0, 1
       or $s5, $s5, $s3

但它完全弄乱了我的代码,有人可以帮我正确翻译吗?或者告诉我我做错了什么?

提前谢谢你,

【问题讨论】:

  • 您在最后一行使用了$s3 而不是$s4。我假设前两条指令不是旋转的一部分。
  • 当我输入这个伪代码时,这是我的错字,代码中的寄存器是正确的,这是不正确的翻译:\
  • 另外,您正在旋转 $t0 而不是 $s4,结果在 $s5 中。因此,不是原始指令的直接替代品。请编辑代码以显示您实际拥有的内容。

标签: assembly translation mips pseudocode


【解决方案1】:

这是关于 Shift 和 Rotate MIPS 指令/伪指令的 UT-Dallas 讲座:https://www.utdallas.edu/~dodge/EE2310/lec14.pdf

幻灯片九拉开了rol/ror伪指令的帷幕。

在幕后有一对移位(srl 和sll)将相关位移动到最终所需的位置,并用0 填充不相关的位位置,然后是or将它们与根据需要旋转的位重新组合。

在您的情况下,您希望将所有位向左旋转一位。要创建这种行为,我们可以使用三个 MIPS 指令:

 srl $t1, $s4, 1 #shift original word 1 bit to the right
 sll $t2, $s4, 31 #shift original word 31 bits to the left
 or $s2, $t1, $t2 #Combine two fragments of words and place result in source register

如果不清楚或者我误解了你的目的,请告诉我。

【讨论】:

    【解决方案2】:

    实际上,'rol/ror' 只是 mips32r2 / mips64r2 之前的 ISA 的伪指令。第 2 版增加了对这些指令的硬件支持。

    您可以随时查看 Linux 中 bitops.h 中的 rol32 / ror32 以获得 C 实现,然后将其分解。

    【讨论】:

      【解决方案3】:

      看起来你交换了很多东西。

      指令格式为:

      inst rd, rs1, rs2
      

      所以你的代码应该是:

      lui $s4, 0x8001     
      ori $s4, $t0, 0x0004
      sll $s5, $s4, 1
      srl $s4, $s4, 31
      or $s4, $s5, $s4
      

      您还可以使用srl,这很好。那个人忽略了这个标志。但是请注意,我先转移到s5,然后转移到$s4。

      我还将结果保存在 $s4 中,因为您的 rol 会这样做(而不是保存在 $s5 中。)

      另外,为了正确模拟你的rol,你当然应该使用$t1(寄存器1,临时)而不是$s5,除非你想在你的堆栈上保存$s5然后恢复它......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多