MIPS到C翻译

问题描述 投票:3回答: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]?

c assembly mips translate
5个回答
1
投票
sw $t1, 0($t0)     # $t0 = A[0]

你有这个从前到后。它是一个商店,所以它用于:

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

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
投票

只是对前面的答案的一点补充:商店一词意味着你不能再访问$ 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)


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];

0
投票

猜猜这是对的。

A[1] = A[0] 
f= A[1] + A[1]
© www.soinside.com 2019 - 2024. All rights reserved.