翻译mips伪指令' rol'

时间:2014-07-02 23:26:25

标签: assembly translation mips pseudocode

我试图翻译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

但它完全搞砸了我的代码,有人可以帮我翻译一下吗?或者告诉我我做错了什么?

提前谢谢你,

3 个答案:

答案 0 :(得分:2)

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

Slide Nine拉回rol / ror伪指令上的窗帘。

在幕后有一对轮班(srlsll),它们将相关位移动到最终所需位置,并使用0&#39填充不相关的位位置; s,然后是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

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

答案 1 :(得分:1)

实际上'rol / ror'只是在mips32r2 / mips64r2之前的ISA的伪实例。 Release 2为这些说明添加了硬件支持。

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

答案 2 :(得分:0)

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

指令格式为:

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保存在堆叠,然后恢复它......