【问题标题】:Store certain bits from one register into certain bits of another register将一个寄存器中的某些位存储到另一个寄存器的某些位中
【发布时间】:2016-10-28 23:28:19
【问题描述】:

我正在努力学习计算机组织,以便为即将到来的学期做好准备,但我偶然发现了这个问题。该问题要求将寄存器 $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,但我知道这是neccecery。

【问题讨论】:

  • 除非您将单词存储到内存中,然后以字节或类似的形式读回,否则字节序无关紧要。左移总是乘以整个寄存器的 2。我还没有阅读完整的问题,所以我想知道问题的另一部分。

标签: assembly mips mips32


【解决方案1】:

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

  1. SRC_MASK
    与源操作数进行 AND 运算的值。

  2. SRC_SHIFT
    将源操作数移动多少。实际上,这也应该指定一个方向,无论是左还是右。我们将在这里假设左移。
    在原生支持旋转操作的 CPU 中,我们可以使用它们来摆脱对方向的需求。

  3. DST_MASK
    与目标操作数进行 AND 运算的值。

那么算法就是

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

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

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

在 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 的角度来看,没有“位字节序”之类的东西,因为寄存器只是保存一组(无论哪种方式)有序位,而不是数字:它是提供这些设定了一个意义。

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

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

为了避免所有这些误解,作者澄清了它们的意思,尽管在我看来,使用了一个糟糕的术语。

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

【讨论】:

    猜你喜欢
    • 2020-12-14
    • 2023-01-12
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 2015-07-05
    • 1970-01-01
    相关资源
    最近更新 更多