Assembly 我能移动二进制数的极限是多少?

Assembly 我能移动二进制数的极限是多少?,assembly,mips,Assembly,Mips,对于一个赋值,我们应该在一个32位二进制数上移动44,这是否意味着最重要的位置变得无关?也就是说,我是否只关心最接近最低有效位置的32位?例如: $t0 = 0xBBBBBBBB #10111011101110111011101110111011 sll $t2, $t0, 44 您可以在MIPS上移动0到31(含31)位位置。移位指令中仅使用移位计数的5个最低有效位。检查您的MIPS文档 如果您想移位超过31个位置,则需要将移位分解为一系列较小的移位,每个移位都会移位31个或更少

对于一个赋值,我们应该在一个32位二进制数上移动44,这是否意味着最重要的位置变得无关?也就是说,我是否只关心最接近最低有效位置的32位?例如:

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

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


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

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


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

我认为你的作业有打字错误。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
节的反汇编。文本:
00000000 :
0:00085300 sll t2,t0,0xc
如你所见,它实际上只会移动12。它只是将移位量除以32。这一结果意味着,像你的作业中提供的指导是不合法的


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

我认为您的作业有输入错误。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
节的反汇编。文本:
00000000 :
0:00085300 sll t2,t0,0xc
如你所见,它实际上只会移动12。它只是将移位量除以32。这一结果意味着,像你的作业中提供的指导是不合法的


您的问题的另一个可能答案是
0
,因为左移任何数字超过其大小可能会在逻辑上导致寄存器充满零。类似的参数也适用于右移,但根据符号扩展行为和开始时第31位中发生的情况,您可能会以
0
0xFFFFFF
结束。是的,确认分配有输入错误。您可能在《计算机组织与设计》中讨论了这个问题:

其答案如下所示:

如果你假设sll$t2,$t0,4,那么答案就完全有道理了

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

将其移位4后。

是,确认作业有打字错误。您可能在《计算机组织与设计》中讨论了这个问题:

其答案如下所示:

如果你假设sll$t2,$t0,4,那么答案就完全有道理了

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

在它移动了4之后。

是的。因为32位可以存储,那么,只有32位。其余部分被截断(基本上这是一个乘法模
2,好的,因为它没有环绕,将$t0移动44,结果是0x00000000?是的,它确实会导致0。你确定这不是一个打字错误吗?MIPS只能在
sll
指令中编码5位的移位。@H2CO3&Jay-结果几乎肯定不会是0。请参阅我的答案以了解更多信息。)说明如果你汇编了那条指令会发生什么。是的。因为32位可以存储,那么,只有32位。其余的被截断了(基本上这是一个乘法模
2,好的,因为它没有环绕,将$t0移动44,结果是0x00000000?是的,它确实会导致0。你确定这不是一个打字错误吗?MIPS只能在
sll
指令中编码5位的移位。@H2CO3&Jay-结果几乎肯定不会是0。请参阅我的答案以了解更多信息。)描述如果你汇编了该指令会发生什么。为什么要中断移位?不管怎样,你总是会得到
0
。@CarlNorum或-1。中断或不中断取决于你正在做什么以及如何做。在不做额外检查和条件分支的情况下进行两次移位可能是完全正确的。为什么要中断移位?Y不管怎样,你总是会得到
0
。@CarlNorum或-1。中断或不中断取决于你正在做什么以及如何进行。在不进行额外检查和有条件分支的情况下进行几次轮班可能是完全好的。