我可以移动二进制数的限制是多少?

时间:2013-01-31 05:57:39

标签: assembly mips

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

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

3 个答案:

答案 0 :(得分:3)

我认为您的作业有拼写错误。 MIPS sll指令仅支持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,因为左移任何数字超过它的大小可能在逻辑上导致一个满的零寄存器。类似的论证适用于右移,但最终会使用00xffffffff,具体取决于符号扩展行为以及启动时位于第31位的内容。

答案 1 :(得分:2)

是的,确认作业有拼写错误。你可能在谈论这个问题:计算机组织和设计: enter image description here

如果答案如下:
enter image description here

如果你假设sll $ t2,$ t0,4,那么答案是完全合理的。

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

在它移动4之后。

答案 2 :(得分:1)

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

如果你想换班31个以上的位置,你需要将你的班次分成一系列较小的班次,每个班次都会换班31个或更少。