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;
}
Note: In the question, size of array 'loc[]' is not defined, so i assumed arrary size 5 i.e.'loc[5]'.
count:
.frame $fp,48,$31 # vars= 32, regs= 1/0, args= 0, gp= 8
.mask 0x40000000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
addiu $sp,$sp,-48
sw $fp,44($sp)
move $fp,$sp
sw $4,48($fp)
sw $5,52($fp)
movz $31,$31,$0
sw $6,56($fp)
sw $0,8($fp)
sw $0,12($fp)
sw $0,16($fp)
sw $0,12($fp)
b $L2
nop
$L4:
lw $2,12($fp)
nop
sll $2,$2,2
lw $3,48($fp)
nop
addu $2,$3,$2
lw $3,0($2)
lw $2,56($fp)
nop
bne $3,$2,$L3
nop
lw $2,8($fp)
nop
addiu $2,$2,1
sw $2,8($fp)
lw $2,16($fp)
nop
sll $2,$2,2
addiu $3,$fp,8
addu $2,$3,$2
lw $3,12($fp)
nop
sw $3,12($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,52($fp)
nop
bne $3,$2,$L4
nop
move $2,$0
move $sp,$fp
lw $fp,44($sp)
addiu $sp,$sp,48
j $31
nop
.set macro
.set reorder
.end count
.size count, .-count
.ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609"