我正在尝试将此C代码直接转换为mips,而不修改任何指令,以使其运行更好:
for(i = 0; i != j; i += 2)
b[i] = a[i] - a[i + 1]
Run Code Online (Sandbox Code Playgroud)
我并不是真的要用mips编码,我只是想了解一些东西。这是我到目前为止(不多):
#t5 = i
$t6 = j
#t1 = a
#t2 = b
#t3 = c
#t10, t11, t12 = free
add $t5, $zero, $zero # initialize i = 0
loop:
bne $t5, $t6 # check if i is not equal to j
addi $t5, $t5, 2 # i += 2
add $t10, $t5, $t11 # temp reg $t10 = address of b[i]
lw $t2, 0($t10) # temp reg $t2 = b[i]
add $t10, $t5, $t12 # temp reg $t10 = address of a[i]
lw $t1, 0($t10) # temp reg $t1 = a[i]
Run Code Online (Sandbox Code Playgroud)
bne由于我没有指定分支的位置,因此不确定该命令是否正确。我已经读过一些关于mips的数组,但这使我感到困惑。我知道将数组放入寄存器时需要为字节寻址使用适当的偏移量。变量而不是数组中的数字会一样吗?任何方向或技巧都将是不错的。谢谢!
您猜对了,bne 需要一个分支位置。所以你的程序中至少还需要一个标签。在下面的示例中,该新标签称为“exit”。
至于加载和存储的寻址,我同意你的观点;一开始它可能会有点令人困惑(特别是如果您习惯了 C 风格的数组索引)。如果您的偏移量不是常量,那么您必须执行加(或减)操作才能获取地址。我们以a[i + 1]的地址为例:首先需要将a的地址添加到i中并将其存储在某个地方,然后您可以使用常量偏移量加载(或存储)到真实地址。我重写了你的例子,这样你就可以明白我在说什么;这是通过示例比通过解释更容易看出的事情之一:)
#t5 = i
#t6 = j
#t1 = address of a
#t2 = address of b
#t10, t11, t12 = free
#START
move $t5,$0 #set $t5 to zero
loop:
bne $t5,$t6,exit #if $t5 not equal to $t6 branch to exit
addi $t10,$t1,$t5 #temp reg $t10 = address of a[i]
lw $t11,1($t10) #temp reg $t11 = a[i + 1]
lw $t12,0($t10) #temp reg $t12 = a[i]
sub $t10,$t12,$t11 #temp reg $t10 = a[i] - a[i + 1]
addi $t11,$t2,$t5 #temp reg $t11 = address of b[i]
sw $t10,0($t11) #store word b[i] = a[i] - a[i + 2]
addi $t5,$t5,2 #i+=2
j loop #jump to start of loop
exit:
Run Code Online (Sandbox Code Playgroud)