【问题标题】:Understanding MIPS while Loops了解 MIPS while 循环
【发布时间】: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: 

仍然有这个解释,我还是不太明白。

  1. 我不明白为什么我们必须左移 2 位。我不明白逻辑左移/右移的目的,也无法将在线解释与实践问题和示例联系起来。

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

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

【问题讨论】:

  • 它在您粘贴的解释中说明了原因:“由于字节寻址问题,我们必须将索引 i 乘以 4。幸运的是,我们可以使用逻辑左移,因为左移2 位乘以 2^2 或 4"。然后它指的是我想你有的某本书中的一页。

标签: mips


【解决方案1】:

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

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

这是假设每个“元素”都是一个长度为 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多