Carmi Merimovich

כרמי מרימוביץ

אתר אישי

factorial:
    addi    t0, zero 2
    bgeu    a0, t0, work    // if (n >= 2) goto work
    addi    a0, zero, 1     // 1
    jalr    zero, 0(ra)     // return (1)
work:   
    addi    sp, sp, -16
    sd      ra, 0(sp)       // save ra
    sd      a0, 8(sp)       //      and n

    addi    a0, a0, -1      // n-1
    jal     ra, factorial   // factorial(n-1)
    ld      t0, 8(sp)       // t0 = n
    mul     a0, a0 t0       // (n-1)! * n

    ld      ra, 0(sp)       // restore ra
    addi    sp, sp, 16      // clean stack
    jalr    x0, 0(ra)       // return ((n-1)! * n)