这是家庭作业的一个问题,但我彻底难倒。这些问题应该有一个直截了当的解决方案,我想知道老师是否错误地将这个问题写成了这样的问题。但这是确切的文字:
“根据存储在内存位置0x10010012中的8位移位计数,编写一个名为LSHIFT的程序,逻辑上将存储位置0x10010010和0x10010011的16位内容移位。”
这是我的问题。为了逻辑移位,MIPS只有两个指令:sll,它取一个立即值(因此我不能使用它,对吧?)和sllv,它取一个存储在寄存器中的值,但只使用5位。这意味着使用sllv,我只能将位移动最多32位(2 ^ 5),但问题是我要编写一个程序,它将移位到256位(8位移位计数为2 ^ 8)。我只能想到两种解决方法:
1)使用乘法
2)将8位数字分成8个并运行8个单独的指令(例如,如果移位计数为256,则向左移动32次,8次)。
我还要仔细检查 - 位可以转移到其他内存位置,对吗?或者它们是否仅限于32位,%4内存地址?例如,计数11111的5位移位是否与计数11111111的8位移位相同,因为这些位被限制为相同的32位存储空间?
如果我对任何事情都错了,请纠正我,因为就像我说的那样,应该有一个简单的解决方案。
答案 0 :(得分:1)
sllv
使用5位来选择32个寄存器中的一个。从那里你不仅限于该寄存器的5位。
看看这个:
.text
main:
addi $t0 $zero 1
addi $t1 $zero 30
sllv $a0 $t0 $t1
li $v0 1
syscall
jr $ra
输出1073741824
或2 ^ 30。