In: Computer Science
Convert the following C function to the corresponding MIPS
assembly procedure:
int count(int a[], int n, int x)
{
int res = 0;
int i = 0;
int j = 0;
int loc[];
for(i = 0; i != n; i++)
if(a[i] == x) {
res = res + 1;
loc [j] = i;
j = j+1}
return res, loc;
}
int loc[]; array size is not defined
so,taking int loc[];
MIPS Code
count:
.frame $fp,40,$31 # vars= 24, regs= 1/0, args= 0, gp= 8
.mask 0x40000000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
addiu $sp,$sp,-40
sw $fp,36($sp)
move $fp,$sp
sw $4,40($fp)
sw $5,44($fp)
movz $31,$31,$0
sw $6,48($fp)
move $4,$sp
move $6,$4
sw $0,8($fp)
sw $0,12($fp)
sw $0,16($fp)
lw $4,48($fp)
nop
addiu $5,$4,-1
sw $5,20($fp)
move $5,$4
move $13,$5
move $12,$0
srl $5,$13,27
sll $8,$12,5
or $8,$5,$8
sll $9,$13,5
move $5,$4
move $11,$5
move $10,$0
srl $5,$11,27
sll $2,$10,5
or $2,$5,$2
sll $3,$11,5
move $2,$4
sll $2,$2,2
addiu $2,$2,3
addiu $2,$2,7
srl $2,$2,3
sll $2,$2,3
subu $sp,$sp,$2
move $2,$sp
addiu $2,$2,3
srl $2,$2,2
sll $2,$2,2
sw $2,24($fp)
sw $0,12($fp)
b $L2
nop
$L4:
lw $2,12($fp)
nop
sll $2,$2,2
lw $3,40($fp)
nop
addu $2,$3,$2
lw $3,0($2)
lw $2,48($fp)
nop
bne $3,$2,$L3
nop
lw $2,8($fp)
nop
addiu $2,$2,1
sw $2,8($fp)
lw $3,24($fp)
lw $2,16($fp)
nop
sll $2,$2,2
addu $2,$3,$2
lw $3,12($fp)
nop
sw $3,0($2)
lw $2,16($fp)
nop
addiu $2,$2,1
sw $2,16($fp)
$L3:
lw $2,12($fp)
nop
addiu $2,$2,1
sw $2,12($fp)
$L2:
lw $3,12($fp)
lw $2,44($fp)
nop
bne $3,$2,$L4
nop
move $2,$0
move $sp,$6
move $sp,$fp
lw $fp,36($sp)
addiu $sp,$sp,40
j $31
nop