1

对于我们应该将 32 位二进制数移位 44 的赋值,这是否意味着最重要的位置变得无关紧要?意思是,我只关心最接近最不重要位置的 32 位吗?例如:

 $t0 = 0xBBBBBBBB
 #10111011101110111011101110111011
 sll  $t2,  $t0,  44
4

3 回答 3

3

我认为你的作业有错字。MIPSsll指令仅支持 5 位的移位。也就是说,指令编码中的字段只有5位长,所以只有[0,31]中的移位值是合法的。事实上,如果我尝试组装这个简单的程序:

    .globl f
    .text
f:
    sll $t2, $t0, 44

我从 gcc 收到警告说:

example.s: Assembler messages:
example.s:3: Warning: Improper shift amount (44)

反汇编输出对象显示:

Disassembly of section .text:

00000000 <f>:
   0:   00085300    sll t2,t0,0xc

正如你所看到的,它实际上只会移动 12。它只是减少了以 32 为模的移动量。这个结果意味着像你的作业中提供的指令是不合法的。

您的问题的另一个可能答案是,0将任何数字左移超过其大小可能在逻辑上会导致寄存器全为零。类似的论点适用于右移,尽管您最终会得到0or 0xffffffff,这取决于符号扩展行为以及开始时第 31 位发生的情况。

于 2013-01-31T18:14:55.970 回答
2

是的,已确认作业有错字。您可能在:计算机组织和设计中谈论这个问题: 在此处输入图像描述

它的答案是这样列出的:
在此处输入图像描述

如果您假设 sll $t2, $t0, 4,那么答案就很合理了。

t0 = 1010 1010 1010 1010 1010 1010 1010 1010
t2 = 1010 1010 1010 1010 1010 1010 1010 0000

在它移动了 4 之后。

于 2016-06-04T19:27:17.027 回答
1

您可以在 MIPS 上移动 0 到 31(包括)位位置。移位指令中仅使用移位计数的 5 个最低有效位。检查您的 MIPS 文档。

如果您想移动超过 31 个位置,则需要将您的移动分解为一系列较小的移动,每个移动移动 31 个或更少的位置。

于 2013-01-31T06:15:11.307 回答