我学习MIPS汇编语言。这是一个锻炼,我想明白了。问题是:
什么是下面的代码对应?
Name: move $t0, $zero
Loop: add $t1, $t0, $t0
add $t1, $t1, $t1
add $t2, $a0, $t1
sw $zero, 0($t2)
addi $t0, $t0, 1
slt $t3, $t0, $a1
bne $t3, $zero, Loop
jr $ra
我已经知道了每一个指令,这些指令是如何工作的,并为循环是什么意思。当我尝试运行在MIPS火星模拟器它与错误结束的代码,可能是因为包含在寄存器$ A0值和$ A1需要开始。
我不明白的大局观。每次循环迭代过程中会发生什么?难道仅仅是一个更大的算法的一部分?什么是它应该做的?
读我想答案的评论在某种程度上更清晰。在代码,$a0
的开头和$a1
应该已经有一定的价值,让我们假设x
分别y
。
第一行move $t0, $zero
将在高级编程语言被int i = 0;
或do-while (condition)
循环的初始值。
下列:
Loop: add $t1, $t0, $t0
add $t1, $t1, $t1
是当循环开始,会像:
int j = 2 * i;
j = 2 * j;
这意味着不久int j = 4 * i;
,迭代器乘以4,因为MIPS寄存器是由32位,这意味着4个字节。
然后add $t2, $a0, $t1
对应于int k = x + j;
或者换句话说,以int k = x + 4 * i
。
下一条指令sw $zero, 0($t2)
存储0
到其地址由0
从包含在$t2
的值的地址的偏移量的存储器。
addi $t0, $t0, 1
增量i++;
和
slt $t3, $t0, $a1
bne $t3, $zero, Loop
jr $ra
检查是否i < y
被满足,这是do - while (i < y)
循环的条件。在情况下,它仍然是真实的,循环的推移设置0
内存中的下一个元素,否则循环结束返回$ra
。