更好的解决方法:B[8] = (i - j) + A[20]?
Better way to solve: B[8] = (i - j) + A[20]?
对于背景,
A[20] = s0,B[8] = s1,i = s4 和 j = s5
所以有个同学帮我做了这个,得到了:
lw t0,80(s0)
add t0, t0,s4
Sub t0,t0,s5
sw to,32(s1)
会不会better/possible有一个:
lw t0,80(s0)
sub t1,s4,s5 for i - j
add t2, t0,t1 for A[20] + (i-j)
sw t2, 32(s1)
现在我不知道我认为的答案是否正确,但希望我在正确的轨道上。
这些基本是这样的:
val = a[20]
val = val + i
val = val - j
b[8] = val
对比
val = a[20]
diff = i - j
result = val + diff
b[8] = result
这两个应该完成同样的事情,并且用相同数量的指令完成。
您的版本减去 i-j
,然后将差异添加到 a[20]
,然后将其存储在 b[8]
中。你同学的版本是加上 a[20]
和 i
,然后从那个和中减去 j
,然后将结果存储在 b[8]
中。这基本上只是做同样事情的不同顺序。
虽然你同学的版本确实使用了更少的寄存器。这本身并没有使它变得更好,但我知道有人可能会因此而认为它更可取。
您的版本更好,原因如下:
- 原话是真的
- 它可能会减少溢出的机会:(A + i) - j 可能会溢出,而 A + ( i - j ) 不一定(见 1,这里对原始表达式是真实的意味着它将表现相同)
- 下一个周期不使用
t0
的负载,因此覆盖了负载使用延迟 — 它实际上 运行 比替代方案 快 1 个周期
请注意,sub
和 add
指令会在溢出时陷入陷阱。问题中没有说明溢出是否有趣或重要。要完全忽略溢出,请改用 subu
和 addu
。
对于背景,
A[20] = s0,B[8] = s1,i = s4 和 j = s5
所以有个同学帮我做了这个,得到了:
lw t0,80(s0)
add t0, t0,s4
Sub t0,t0,s5
sw to,32(s1)
会不会better/possible有一个:
lw t0,80(s0)
sub t1,s4,s5 for i - j
add t2, t0,t1 for A[20] + (i-j)
sw t2, 32(s1)
现在我不知道我认为的答案是否正确,但希望我在正确的轨道上。
这些基本是这样的:
val = a[20]
val = val + i
val = val - j
b[8] = val
对比
val = a[20]
diff = i - j
result = val + diff
b[8] = result
这两个应该完成同样的事情,并且用相同数量的指令完成。
您的版本减去 i-j
,然后将差异添加到 a[20]
,然后将其存储在 b[8]
中。你同学的版本是加上 a[20]
和 i
,然后从那个和中减去 j
,然后将结果存储在 b[8]
中。这基本上只是做同样事情的不同顺序。
虽然你同学的版本确实使用了更少的寄存器。这本身并没有使它变得更好,但我知道有人可能会因此而认为它更可取。
您的版本更好,原因如下:
- 原话是真的
- 它可能会减少溢出的机会:(A + i) - j 可能会溢出,而 A + ( i - j ) 不一定(见 1,这里对原始表达式是真实的意味着它将表现相同)
- 下一个周期不使用
t0
的负载,因此覆盖了负载使用延迟 — 它实际上 运行 比替代方案 快 1 个周期
请注意,sub
和 add
指令会在溢出时陷入陷阱。问题中没有说明溢出是否有趣或重要。要完全忽略溢出,请改用 subu
和 addu
。