我需要将一些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]?
答案 0 :(得分:2)
我认为你完全错了。
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]
答案 1 :(得分:1)
sw $t1, 0($t0) # $t0 = A[0]
你有这个从前到后。它是商店,因此使用 :
sw $t1, 0($t0) # A[1] = $t1
答案 2 :(得分:1)
只是对以前答案的一点补充:
商店字意味着您不能再访问$ t1,因为它被复制到内存中。至少你不应该使用商店字指令中的$ t1。您应该使用之前的那个(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)
)。这意味着答案是com.github.nukc.loadmorelayout:library:0.1.0
Error:(44, 13) Failed to resolve: com.github.nukc.loadmorelayout:library:0.1.0
答案 3 :(得分:1)
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];
答案 4 :(得分:0)
猜猜这是对的。
A[1] = A[0]
f= A[1] + A[1]
答案 5 :(得分:0)
实际上,您使用A [1]两次,如下所示:
寄存器$ t0包含第一条指令中的数组地址
sw $t1, 0($t0) # A[1] = $t1 => A[1] = &A[0]
将地址值($ t0 + 0)装入寄存器$ t0
lw $t0, 0($t0) # $t0 = A[1]
基本=>
$t0 = &A[0]