搜尋此網誌

顯示具有 MIPS 標籤的文章。 顯示所有文章
顯示具有 MIPS 標籤的文章。 顯示所有文章

[MIPS] 階乘實作

int factorial (int n) {
    if (n <1)
        return 1;
    else
        return (n*factorial(n-1));
}
fact:
    addi    $sp, $sp, -8
    sw      $ra, 4($sp)     # save $ra
    slti    $t0, $a0, 1     # n < 1?
    beq     $t0, $zero, L1
    addi    $v0, $zero, 1   # return 1
    addi    $sp, $sp, 8     # fix up the stack pointer & return
    jr      $ra
L1:
    sw      $a0, 0($sp)     # save argument $a0
    addi    $a0, $a0, -1    # n = n-1   
    jal     fact            # jal(n-1)
    lw      $a0, 0($sp)     # restore argument $a0
    mul     $v0, $a0, $v0   # return n*fact(n-1)
    lw      $ra, 4($sp)     # restore $ra
    addi    $sp, $sp, 8     # restore stack pointer
    jr      $ra             # return to the caller

[MIPS] strcpy實作

strcpy:
    addi    $sp, $sp, -4        # adjust stack for 1 more item
    sw      $s0, 0($sp)         # save $s0
    add     $s0, $zero, $zero   # i = 0
L1:
    add     $t1, $s0, $a1       # address of y[i] in $t1
    lb      $t2, 0($t1)         # t2 = y[i]
    add     $t3, $s0, $a0       # address of x[i] in $t3
    sb      $t2, 0($t3)         # x[i] = y[i]
    beq     $t2, $zero, L2      # if y[i]==0, go to L2
    addi    $s0, $s0, 1         # i= i+1
    j       L1                  # go to L1
L2:
    lw      $s0, 0($sp)         # y[i] ==0; end of string, restore old $s0
    addi    $sp, $sp, 4         # pop 1 word off stack
    jr      $ra                 # return