对于我们应该将 32 位二进制数移位 44 的赋值,这是否意味着最重要的位置变得无关紧要?意思是,我只关心最接近最不重要位置的 32 位吗?例如:
$t0 = 0xBBBBBBBB
#10111011101110111011101110111011
sll $t2, $t0, 44
我认为你的作业有错字。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
将任何数字左移超过其大小可能在逻辑上会导致寄存器全为零。类似的论点适用于右移,尽管您最终会得到0
or 0xffffffff
,这取决于符号扩展行为以及开始时第 31 位发生的情况。
您可以在 MIPS 上移动 0 到 31(包括)位位置。移位指令中仅使用移位计数的 5 个最低有效位。检查您的 MIPS 文档。
如果您想移动超过 31 个位置,则需要将您的移动分解为一系列较小的移动,每个移动移动 31 个或更少的位置。