找到最短的MIPS指令序列,该指令从寄存器$ t0提取第16位至第11位,并使用该字段的值替换寄存器$ t1中的第31位至第26位,而不更改寄存器$ t1的其他26位。 您能帮您更清楚地解释吗?还是帮我做?
答案 0 :(得分:1)
找到最短的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 << 26
sll $ t1,$ t1,5
srl $ t1,$ t1,5
或$ t1,$ t1,$ t0
你看到我们在这里做什么吗?
答案 1 :(得分:0)
我不了解MIPS,但这仅涉及位操作:
MIPS中的类似寄存器是32位。 假设位的编号为0到31,最高位是最左边的一位,它是位号31。
要提取位16..11(总共6位),您必须执行6位AND,例如$ t0和0b00000000 00000001 11111000 00000000。
要替换$ t1中的位比较麻烦:首先,必须将位31..26设置为零,例如$ t1&0b00000011 11111111 11111111 11111111
接下来,您必须将源左移15位(从16到31有15位),例如$ t0 << 15。
最后,您需要进行OR'em操作,例如$ t1 = $ t1 | $ t0