了解 MIPS while 循环

Understanding MIPS while Loops

鉴于 C 中的传统 while 循环:

while(save[i] == k)
     i += 1;

MIPS 中的答案是这样的:

第一步是将 save[i] 加载到临时寄存器中。在我们加载之前 将 [i] 保存到一个临时寄存器中,我们需要知道它的地址。在我们之前 可以将 i 添加到数组 save 的底部以形成地址,我们必须乘以 由于字节寻址问题,索引 i 增加了 4。幸运的是,我们可以使用 shift 左逻辑,因为 shift ing left by 2 bits 乘以 22 或 4(请参阅上一节中的第 88 页)。我们需要为其添加标签 Loop 以便我们可以在循环结束时分支回该指令:

Loop: sll $t1,$s3,2 # Temp reg $t1 = i * 4

为了得到save[i]的地址,我们需要在$s6中加上$t1和save的base:

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: 

还是这样解释,我还是不太明白。

  1. 不明白为什么要左移2位。不明白shift left/right 逻辑的用途,无法将网上的解释与练习题和例子联系起来。

  2. 因为我什至没有得到第1步,所以我没有得到第2步,即添加移位的结果($t1)和保存在$s6中的基数。

基本上,我需要解释这个问题,因为即使有答案我也不太明白。我真的需要一个简单的(简单的)解释来清楚地解释每一步以及为什么这样做。请谢谢!

假设您有从临时地址值开始的数据:

temp address V
             | ValueA | ValueB | ValuesC  |
Byte  offset  0  1 2 3  4 5 6 7  8 9 10 11
Array index   0         1        2

这是假设每个 'element' 都是一个长度为 4 字节的整数。

获取元素首地址时,可以看到是4的倍数

MIPS 不关心地址是什么(就大小而言),因此您需要自己处理。

所以第一个元素的地址在tempaddress+0,第二个元素在tempaddress+(1*4)等等

或者,当使其更通用时,元素 X 位于 temp address + (X*4)

X*4 等同于将 X 左移 2。

即:如果X是二进制的值1,即0000 0001

左移2,即0000 0100或十进制数4。

若X为二进制的值3,即0000 0011

左移2,即0000 1100或十进制12。