了解 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:
还是这样解释,我还是不太明白。
不明白为什么要左移2位。不明白shift left/right 逻辑的用途,无法将网上的解释与练习题和例子联系起来。
因为我什至没有得到第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。
鉴于 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:
还是这样解释,我还是不太明白。
不明白为什么要左移2位。不明白shift left/right 逻辑的用途,无法将网上的解释与练习题和例子联系起来。
因为我什至没有得到第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。