MIPS到C翻译

时间:2013-09-19 02:22:34

标签: c assembly mips translate

我需要将一些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]?

6 个答案:

答案 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]