我正在努力学习计算机组织,以便为即将到来的学期做好准备,我偶然发现了这个问题。该问题要求将寄存器$ 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,但我知道它是必要的。
答案 0 :(得分:1)
每当您必须将一个位块从一个源传输到一个目的地时,该过程始终是相同的,并且可以通过三个参数来描述:
<强> SRC_MASK 强>
源操作数与ANDed的值。
<强> SRC_SHIFT 强>
移动源操作数多少钱。实际上这也应该指定一个方向,左边是右边。我们将假设左移。
在本机支持旋转操作的CPU中,我们可以使用它们来消除方向的需要。
<强> DST_MASK 强>
目标操作数与AND编号的值。
然后算法
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 )和右边的标签作为“反向排序”。