【问题标题】:MIPS assembly code--shifting left using an 8-bit shift count in memoryMIPS 汇编代码——使用内存中的 8 位移位计数左移
【发布时间】: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。

标签: assembly mips bit-shift


【解决方案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。

【讨论】:

    猜你喜欢
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    相关资源
    最近更新 更多