MIPS to C Translation

15,825

Solution 1

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

You've got this back-to-front. It is a store, so it is used:

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

Solution 2

I think you have got in completely wrong.

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

After the addi, register $t0 became the memory address of A[1], which would be &A[1], not A[1]. To get value of A[1], you need to use lw after you done the addi

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

Solution 3

Just a little addition to the previous answers: The store word means that you cannot access $t1 anymore because it is copied to memory. At least you should not use the $t1 from the store word instruction. You should use the one before (add $t1, $s6, $0). This means that the answer is 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)

Solution 4

Mnush's answer is incorrect.

The last line is adding $t1 and $t0.

$t1 = A[0] and

$t0 = A[1].

With proper comments:

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]

The C Code:

A[1] = A[0];
f = A[0] + A[1];

Solution 5

Actually you are using A[1] twice as shown:

  • Register $t0 carries the address of the array from the first instruction

    sw $t1, 0($t0)    #  A[1] = $t1  =>  A[1] = &A[0]
    
  • Load the value of the address ($t0 + 0) into register $t0

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

    $t0 = &A[0]
    
Share:
15,825
user2789564
Author by

user2789564

Updated on June 04, 2022

Comments

  • user2789564
    user2789564 almost 2 years

    I need to translate some MIPS assembly instructions to C code. I think I got it, but it seems counter-intuitive. Any help? We have variables f, g, h, i, j stored in registers $s0, $s1, $s2, $s3 and $s4 respectively. The base of arrays A and B are stored in $s6 and $s7 respectively. 4 byte words. Comments in the code are my own.

    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]
    

    I just feel like I'm wrong. Why make $t0 A[1] first if we never use it?