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"