5

我需要将一些 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],为什么要先创建它?

4

7 回答 7

3

我认为你完全错了。

addi $t0, $s6, 4 # $t0 = A[1]

addi 之后,寄存器$t0成为 A[1] 的内存地址,即&A[1], not A[1]。要获得 A[1] 的值,您需要lw在完成后使用addi

lw $t0, 0($t0) # $t0 =A[1]

于 2016-06-17T09:47:29.717 回答
2
sw $t1, 0($t0)     # $t0 = A[0]

你有这个从后到前。它是一个store,所以它使用:

sw $t1, 0($t0)     # A[1] = $t1
于 2013-09-19T02:47:27.420 回答
1

只是对先前答案的一点补充:存储字意味着您无法再访问 $t1 ,因为它已复制到内存中。至少你不应该使用 store word 指令中的 $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)

于 2015-10-16T09:18:10.623 回答
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];
于 2018-09-29T20:06:10.063 回答
1

实际上你使用 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]
    
于 2020-09-23T13:30:25.280 回答
0
    addi $t0, $s6, 4   # $t0 = &A[1]
    add $t1, $s6, $0   # $t1 = &A[0]
    sw $t1, 0($t0)     # A[1] = &A[0]
    lw $t0, 0($t0)     # $t0 = A[1]
    add $s0, $t1, $t0  # f = &A[0] + A[1]

C 代码:f = &A[0] + A[1]

于 2021-12-09T03:26:53.030 回答
-1

猜猜这是正确的。

A[1] = A[0] 
f= A[1] + A[1]
于 2013-10-15T01:54:22.637 回答