【发布时间】:2019-03-12 03:38:59
【问题描述】:
鉴于 C 中的传统 while 循环:
while(save[i] == k)
i += 1;
MIPS 中的答案是这样的:
第一步是将 save[i] 加载到临时寄存器中。在我们加载之前 save[i] 到一个临时寄存器,我们需要有它的地址。在我们之前 可以将 i 添加到数组 save 的基数以形成地址,我们必须乘以 由于字节寻址问题,索引 i 增加了 4。幸运的是,我们可以使用 shift 左逻辑,因为左移 2 位乘以 22 或 4(参见上一节中的第 88 页)。我们需要为其添加标签 Loop,以便我们可以在循环结束时分支回到该指令:
Loop: sll $t1,$s3,2 # Temp reg $t1 = i * 4
要得到save[i]的地址,我们需要在$s6中加上$t1和save的基数:
add $t1,$t1,$s6 # $t1 = address of save[i]
现在我们可以使用该地址将 save[i] 加载到临时寄存器中:
lw $t0,0($t1) # Temp reg $t0 = save[i]
下一条指令执行循环测试,如果 save[i] ≠ k 则退出:
bne $t0,$s5, Exit # go to Exit if save[i] ≠ k
然后
addi $s3, $s3, 1 #i = i+1
j Loop # go to Loop
Exit:
仍然有这个解释,我还是不太明白。
我不明白为什么我们必须左移 2 位。我不明白逻辑左移/右移的目的,也无法将在线解释与实践问题和示例联系起来。
因为我什至没有得到第 1 步,所以我没有得到第 2 步,即在 $s6 中添加移位的结果 ($t1) 和保存的基数。
基本上,我需要解释这个问题,因为即使有答案我也不能完全理解。我真的需要一个简单的(简化的)解释,清楚地解释每一步以及为什么这样做。请和谢谢!
【问题讨论】:
-
它在您粘贴的解释中说明了原因:“由于字节寻址问题,我们必须将索引 i 乘以 4。幸运的是,我们可以使用逻辑左移,因为左移2 位乘以 2^2 或 4"。然后它指的是我想你有的某本书中的一页。
标签: mips