我正在尝试将C代码转换为MIPS汇编。以下是两个C代码片段。问题在于我的解决方案与标准解决方案不同,而且我也不理解标准解决方案。希望有人能够解释一下以下两个mips汇编代码片段。
首先,任务需要的仅有以下MIPS指令:lw、add、beq、bne和j。 寄存器: $s3包含i $s4包含j $s5包含k A是一个32位整数数组,其初始地址在$s6中 $t0和$t1可用于存储临时变量
第一个是一个简单的do-while循环:
首先,任务需要的仅有以下MIPS指令:lw、add、beq、bne和j。 寄存器: $s3包含i $s4包含j $s5包含k A是一个32位整数数组,其初始地址在$s6中 $t0和$t1可用于存储临时变量
第一个是一个简单的do-while循环:
do {
i = i + j;
} while(A[i] == k);
MIPS汇编
loop: add $s3, $s3, $s4 // this is i = i+j
add $t1, $s3, $s3 // from now on
add $t1, $t1, $t1 // I cant follow anymore
add $t1, $t1, $s6 // What happens in these three lines?
lw $t0, 0($t1) // 0($t1) is new for me. What does this zero do?
beq $t0, $s5, loop
现在是第二段C代码:
if ( i == j )
i = i + A[k];
else if( i == k )
i = i + A[j];
else
i = i + k;
这里是MIPS汇编代码:
bne $s3, $s4, Else1 // this line is if(i==j)
add $t1, $s5, $s5 // from here on
add $t1, $t1, $t1 // till
add $t1, $t1, $s6 //
lw $t0, 0($t1) //
add $s3, $s3, $t0 // here I don't understand
j done
ELSE1: bne $s3, $s5, Else2 // this line is if(i==k)
add $t1, $s4, $s4 // The same game as above
add $t1, $t1, $t1
add $t1, $t1, $s6
lw $t0, 0($t1)
add $s3, $s3, $t0 // till here
j done
ELSE2: add $s3, $s4, $s5
有人能解释一下到底发生了什么吗?这会非常有帮助。