将一个寄存器中的某些位存储到另一个寄存器的某些位

时间:2016-06-27 03:52:23

标签: assembly mips mips32

我正在努力学习计算机组织,以便为即将到来的学期做好准备,我偶然发现了这个问题。该问题要求将寄存器$ 1中的第5位到第10位存储到寄存器$ 2的第10位到第15位,而不更改$ 1和剩余的$ 2位。注意:它还说位编号是小端。

所以这就是我所做的。

sll $3, $1, 22    
slr $3, $3, 27
sll $3, $3, 10    # after last 3 steps $3 should have desired bits from $1 in bits 10 to 
                  # 15, and the rest of its bits should be 0`s.
or $2, $2, $3  

现在我的问题是,字节顺序是否会影响我提出的代码?此代码对于问题的要求是否正确?

小小的评论,我忘记在我或它之前将寄存器2的第10位到第15位设置为0,但我知道它是必要的。

1 个答案:

答案 0 :(得分:1)

每当您必须将一个位块从一个源传输到一个目的地时,该过程始终是相同的,并且可以通过三个参数来描述:

  1. <强> SRC_MASK
    源操作数与ANDed的值。

  2. <强> SRC_SHIFT
    移动源操作数多少钱。实际上这也应该指定一个方向,左边是右边。我们将假设左移。
    在本机支持旋转操作的CPU中,我们可以使用它们来消除方向的需要。

  3. <强> DST_MASK
    目标操作数与AND编号的值。

  4. 然后算法

    dst = (dst & DST_MASK) | (src & SRC_MASK) << SRC_SHIFT;
    

    这是一种通用算法,特定实例可以导致特定的优化,因为一个简单的例子考虑所有位的移动,这是一个简单的“移动”。

    由于通常掩码具有寄存器的大小,因此在MIPS中,这需要经典地使用lui / ori对。 或者,我们可以像您一样使用移位来屏蔽源操作数的非相关位,但是这不能用于清除目标中的非连续位块(实际上您没有)。 / p>

    在MIPS中,上面的C代码是:

    lui $t0, SRC_MASK >> 16
    ori $t0, SRC_MASK & 0xffff     ;t0 = SRC_MASK
    
    lui $t1, DST_MASK >> 16
    ori $t1, DST_MASK & 0xffff     ;t1 = DST_MASK
    
    and $t2, $1, $t0               ;t2 = src & SRC_MASK
    sll $t2, SRC_SHIFT             ;t2 = (src & SRC_MASK) << SRC_SHIFT
    
    and $2, $2, $t1                ;$2 = dst & DST_MASK
    or $2, $2, $t2                 ;$2 = (dst & DST_MASK) |  (src & SRC_MASK) << SRC_SHIFT
    

    对于有问题的问题,面具的值和移位量是:

      

    SRC_MASK = 0x000007e0h
      SRC_SHIFT = 5
      SRC_MASK = 0xffff03ffh

    关于字节序的一个词

    我不喜欢排序位的“字节序”这个词,而是与byte ordering太相关了。

    有了一个字,我们可以用两种方式标记它的位:

    31     23     17     7      0        0      7      15     24      31
    +------+------+------+------+        +------+------+------+------+  
    |                           |        |                           |
    +------+------+------+------+        +------+------+------+------+
    
           Little endian                           Big endian
    

    这是一个对人类有用的约定,从CPU的角度来看,没有“bit endianess”这样的东西,因为寄存器只包含一组,无论是哪种方式,有序位,而不是数字:它是给出的软件这些都有意义。

    所以问题是提到“小端”只是为了澄清作者在谈到位时想到了左标记。

    简单地说,问题“鉴于数字12345,哪一个是第二位数?”并未普遍回答为“ 4 ”一些人的数学背景很少倾向于回答“ 2 ”。此外,他们倾向于将“第二个数字”(即4)与“数字与索引/位置2 ”混淆为“ 3 “(因为索引从0开始,没有第0位)。

    为了避免所有这些误解,作者清除了他们的意思,尽管在我看来,使用了一个不好的术语。

    我个人将左边的标签称为“自然排序”(因为设置位 X 我们或者2 X )和右边的标签作为“反向排序”。