【发布时间】:2018-10-06 23:00:58
【问题描述】:
找到最短的 MIPS 指令序列,从寄存器 $t0 中提取第 16 位到第 11 位,并使用该字段的值替换寄存器 $t1 中的第 31 位到第 26 位,而不更改寄存器 $t1 的其他 26 位。 你能帮助更清楚地解释这一点吗?还是帮我做?
【问题讨论】:
-
哪一部分不清楚?
-
全部,我什至不知道从哪里开始
找到最短的 MIPS 指令序列,从寄存器 $t0 中提取第 16 位到第 11 位,并使用该字段的值替换寄存器 $t1 中的第 31 位到第 26 位,而不更改寄存器 $t1 的其他 26 位。 你能帮助更清楚地解释这一点吗?还是帮我做?
【问题讨论】:
找到最短的 MIPS 指令序列,从寄存器 $t0 中提取第 16 位到第 11 位,并使用该字段的值替换寄存器 $t1 中的第 31 位到第 26 位,而不更改寄存器 $t1 的其他 26 位。你能帮助更清楚地解释这一点吗?还是帮我做?
它表示在 32 位 MIPS 寄存器 $t0 中,位索引为 31(最高有效位)-0(最低有效位)采用范围 16-11(含)索引的位子集.所以,
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 (16 15 14 13 12 11) 10 9 8 7 6 5 4 3 2 1 0
然后,将它们复制到寄存器$t1 的位由范围“31 到 26”索引,
(31 30 29 28 27 26) 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
$t1 (25-0) 中的其余位不应更改。
你能想出用srl, sll, or(右移、左移或)的方法吗?
srl $t0, $t0, 11 # t0 = t0 >> 11
sll $t0, $t0, 26 # t0 = t0 sll $t1, $t1, 5
srl $t1, $t1, 5
或 $t1、$t1、$t0
你看到我们在这里做了什么吗?
【讨论】:
我不知道 MIPS,但这都是关于位操作的:
看起来 MIPS 中的寄存器是 32 位的。 假设位编号为 0 到 31,最重要的一位是最左边的一位,它是位号 31。
要提取第 16..11 位(总共 6 位),您必须执行 6 位与运算,例如 $t0 & 0b00000000 00000001 11111000 00000000。
要替换 $t1 中的位比较棘手:首先您必须将位 31..26 设置为零,例如 $t1 & 0b00000011 11111111 11111111 11111111
接下来,您必须将源左移 15 位(从 16 到 31 有 15 位),例如 $t0
最后你需要 OR'em,比如 $t1 = $t1 | $t0
【讨论】: