Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Converting C code to MIPS (arrays)

Tags:

c

assembly

mips

for (i = 0; i < 64; i++) {
A[i] = B[i] + C[i];
}

The MIPS instructions for the above C code is:

add $t4, $zero, $zero   # I1 i is initialized to 0, $t4 = 0
Loop: 
add $t5, $t4, $t1       # I2 temp reg $t5 = address of b[i]
lw $t6, 0($t5)          # I3 temp reg $t6 = b[i]
add $t5, $t4, $t2       # I4 temp reg $t5 = address of c[i]
lw $t7, 0($t5)          # I5 temp reg $t7 = c[i]
add $t6, $t6, $t7       # I6 temp reg $t6 = b[i] + c[i]
add $t5, $t4, $t0       # I7 temp reg $t5 = address of a[i]
sw $t6, 0($t5)          # I8 a[i] = b[i] + c[i]
addi $t4, $t4, 4         # I9 i = i + 1
slti $t5, $t4, 256       # I10 $t5 = 1 if $t4 < 256, i.e. i < 64
bne $t5, $zero, Loop    # I11 go to Loop if $t4 < 256

For I8, could the sw instruction not be replaced with an addi instruction? i.e addi $t5, $t6, 0

Wouldn't it achieve the same task of copying the address of $t6 into $t5? I would like to know the difference and when to use either of them. Same could be said about the lw instruction.

Also, maybe a related question, how does MIPS handle pointers?

edit: changed addi $t6, $t5, 0.

like image 250
mike fisher Avatar asked Dec 12 '22 01:12

mike fisher


1 Answers

The sw instruction in MIPS stores the first argument (value in $t6) to the address in the second argument (value in $t5) offset by the constant value (0).

You're not actually trying to store the $t5 address into a register, but rather storing the value in $t6 into the memory location represented by the value of $t5.

If you like, you could consider the value in $t5 to be analogous to a C pointer. In other words, MIPS does not handle pointers vs values differently-- all that matters is where you use the values. If you use a register's value as the second argument to lw or sw, then you are effectively using that register as a pointer. If you use a register's value as the first argument to lw or sw, or in most other places, you are operating directly on the value. (Of course, just like in C pointer arithmetic, you might manipulate an address so you can store a piece of data somewhere else in memory.)

like image 197
Platinum Azure Avatar answered Dec 27 '22 12:12

Platinum Azure