我需要将一些MIPS汇编指令转换为C代码。我想我明白了,但似乎反直觉。有帮助吗?我们将变量f,g,h,i,j分别存储在寄存器$ s0,$ s1,$ s2,$ s3和$ s4中。数组A和B的基数分别存储在$ s6和$ s7中。 4个字节的单词。代码中的注释是我自己的。
addi $t0, $s6, 4 # $t0 = A[1]
add $t1, $s6, $0 # $t1 = A[0]
sw $t1, 0($t0) # $t0 = A[0]
lw $t0, 0($t0) # $t0 = A[0]
add $s0, $t1, $t0 # f = A[0] + A[0]
我觉得我错了。如果我们从不使用它,为什么要先使用$ t0 A [1]?
sw $t1, 0($t0) # $t0 = A[0]
你有这个从前到后。它是一个商店,所以它用于:
sw $t1, 0($t0) # A[1] = $t1
我认为你完全错了。
addi $t0, $s6, 4 # $t0 = A[1]
在addi之后,寄存器$t0
成为A [1]的内存地址,这将是&A[1]
,而不是A[1]
。要获得A [1]的值,你需要在完成lw
之后使用addi
lw $t0, 0($t0) # $t0 =A[1]
只是对前面的答案的一点补充:商店一词意味着你不能再访问$ t1,因为它被复制到内存中。至少你不应该使用商店字指令中的$ t1。你应该使用之前的那个(add $t1, $s6, $0
)。这意味着答案是f ( which is in $s0) = &A[0] (base address in register $t1) + A[1] (value of the array with word index 1, which is in register $t0)
Mnush的回答是不正确的。
最后一行是添加$ t1和$ t0。
$ t1 = A [0]和
$ t0 = A [1]。
有适当的评论:
addi $t0, $s6, 4 # $t0 = &A[1]
add $t1, $s6, $0 # $t1 = &A[0]
sw $t1, 0($t0) # A[0] = A[1]
lw $t0, 0($t0) # $t0 = A[0]
add $s0, $t1, $t0 # f = A[0] + A[1]
C代码:
A[1] = A[0];
f = A[0] + A[1];
猜猜这是对的。
A[1] = A[0]
f= A[1] + A[1]