C to MIPS Conversion Practice Set 3
Full MIPS solutions are provided below so you can blank out fields as needed.
Assumptions:
- Calling convention: arguments in $a0, $a1, $a2, return with jr $ra
- 32-bit MIPS
1) Function f1
C code:
/* ptr: $a0, i: $a1, val: $a2 */
void f1(char *ptr, int i, unsigned val)
{
int tmp = val * 16;
ptr[i] = (ptr[i] & tmp) - 3;
}
MIPS solution:
f1:
____ $t0, $a2, ____
add $t1, $a0, $a1
____ $t2, 0($t1)
and $t2, $t2, ____
addi $t2, $t2, -3
____ ____, ____
jr $ra
2) Function f2
C code:
/* data: $a0, val: $a1 */
void f2(int *data, int val)
{
if (val >= 0) {
data[val] = 0x1234fedc;
}
data[1] = data[val] + 1;
}
MIPS solution:
f2:
____ $t0, ____, $zero
____ $t0, $zero, L_skip
____ $t1, $a1, ____
add $t1, $a0, $t1
____ $t2, ____
____ $t2, $t2, 0xfedc
sw $t2, ____
L_skip:
sll $t1, $a1, ____
add $t1, $a0, $t1
lw $t3, ____
addi $t3, $t3, 1
sw $t3, ____
jr $ra
f1 Solutions
f1:
sll $t0, $a2, 4
add $t1, $a0, $a1
lb $t2, 0($t1)
and $t2, $t2, $t0
addi $t2, $t2, -3
sb $t2, 0($t1)
jr $ra
f2 Solutions
f2:
slt $t0, $a1, $zero
bne $t0, $zero, L_skip
sll $t1, $a1, 2
add $t1, $a0, $t1
lui $t2, 0x1234
ori $t2, $t2, 0xfedc
sw $t2, 0($t1)
L_skip:
sll $t1, $a1, 2
add $t1, $a0, $t1
lw $t3, 0($t1)
addi $t3, $t3, 1
sw $t3, 4($a0)
jr $ra