我试图翻译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
但它完全搞砸了我的代码,有人可以帮我翻译一下吗?或者告诉我我做错了什么?
提前谢谢你,
答案 0 :(得分:2)
这是关于Shift
和Rotate
MIPS指令/伪指令的UT-Dallas讲座:https://www.utdallas.edu/~dodge/EE2310/lec14.pdf
Slide Nine拉回rol
/ ror
伪指令上的窗帘。
在幕后有一对轮班(srl
和sll
),它们将相关位移动到最终所需位置,并使用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
保存在堆叠,然后恢复它......