理解MIPS while循环

理解MIPS while循环,mips,Mips,给定C中的传统while循环: while(save[i] == k) i += 1; MIPS中的答案如下: 第一步是将save[i]加载到临时寄存器中。在我们装货之前 将[i]保存到临时寄存器中,我们需要知道它的地址。在我们之前 可以将i添加到数组save的基来形成地址,我们必须将 由于字节寻址问题,索引i被4。幸运的是,我们可以使用shift 左逻辑,因为左移2位乘以22 或4(见上一节第88页)。我们需要向其添加标签循环,以便可以在循环结束时分支回该指令: Loop: sll

给定C中的传统while循环:

while(save[i] == k)
     i += 1;
MIPS中的答案如下:

第一步是将save[i]加载到临时寄存器中。在我们装货之前 将[i]保存到临时寄存器中,我们需要知道它的地址。在我们之前 可以将i添加到数组save的基来形成地址,我们必须将 由于字节寻址问题,索引i被4。幸运的是,我们可以使用shift 左逻辑,因为左移2位乘以22 或4(见上一节第88页)。我们需要向其添加标签循环,以便可以在循环结束时分支回该指令:

Loop: sll $t1,$s3,2 # Temp reg $t1 = i * 4
要获得save[i]的地址,我们需要添加$t1和$s6中save的基数:

add $t1,$t1,$s6 # $t1 = address of save[i]
现在,我们可以使用该地址将save[i]加载到临时寄存器中:

lw $t0,0($t1) # Temp reg $t0 = save[i]
下一条指令执行循环测试,如果保存[i],则退出≠ k:

bne $t0,$s5, Exit # go to Exit if save[i] ≠ k
然后

尽管有这样的解释,我还是不太明白

  • 我不明白为什么我们必须左移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
    
    这是假设每个“元素”是一个长度为4字节的整数

    当获取元素开头的地址时,可以看到它是4的倍数

    MIPS不关心地址上的内容(大小),所以您需要自己处理

    因此,第一个元素的地址位于tempaddress+0,第二个元素位于
    tempaddress+(1*4)

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

    X*4与X向左移动2相同

    一、 e:如果X是二进制值1,即
    0000 0001

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

    如果X是二进制中的值3,即
    0000 0011


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

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