【发布时间】:2014-02-25 05:18:03
【问题描述】:
这是一个家庭作业的问题,但我完全被难住了。这些问题应该有一个直截了当的解决方案,我想知道老师是否可能错误地把这个问题变成了这样。但这里是确切的文字:
“编写一个名为 LSHIFT 的程序,根据存储在内存位置 0x10010012 中的 8 位移位计数,将存储器位置 0x10010010 和 0x10010011 的 16 位内容逻辑左移。”
这是我的问题。为了对位进行逻辑移位,MIPS 只有两条指令:sll,它采用立即数(因此我不能使用它,对吗?)和 sllv,它采用存储在寄存器中的值,但只使用 5 位。这意味着使用 sllv,我最多只能将位移动 32 位(2^5),但问题要我编写一个最多可移动 256 位的程序(2^8 用于 8 位移位计数)。我只能想到两种解决方法:
1) 改用乘法
2) 将 8 位数字分成 8 段并运行 8 条单独的指令(例如,如果移位计数为 256,则左移 32,8 次)。
我还想仔细检查一下——位可以转移到其他内存位置,对吗?还是它们仅限于 32 位 %4 内存地址?例如,计数 11111 的 5 位移位是否会与计数 11111111 的 8 位移位执行相同的操作,因为这些位被限制在相同的 32 位内存空间中?
如果我有任何错误,请纠正我,因为就像我说的,应该有一个简单的解决方案。
【问题讨论】:
-
如何判断寄存器是否左移了 16 位以上? (你打算如何使用乘法?)对我来说,这听起来像是名字下降。
-
这是我的问题的一部分。我问是否有区别,即如果你能分辨出来(在大于和小于内存空间大小的位移之间)。根据您的评论,我假设您无法分辨,我可以使用 sllv 指令。此外,为了它的价值,我正在考虑用乘法代替移位——每次移位乘以 2。