1. 程式人生 > 實用技巧 >MIPS——無符號除法

MIPS——無符號除法

用MIPS實現divu,被除數$a0,除數$a1,商$v0,餘數$v1,具體細節已寫在註釋。如有錯誤請指正。

.data
    error:
         .ascii "The divisor can't not be zero!"   #若除數為0則報錯
    space:
         .ascii " "          #空格,輸出時將商和餘數分開
.text
main:
    li $v0 5                 #輸入被除數$a0 同時作為餘數
    syscall
    addu $a0 $v0 $0
    li $v0 5                 #輸入除數$a1,並且除數開始放在高32位
    syscall
    addu $a1 $v0 $
0 beq $a1 0 print_error #若除數為0則報錯 li $s0 0 #$s0儲存除數的低32位 li $t2 0 #$t2記錄過程執行次數 li $v0 0 #$v0儲存商 divv: slti $t1 $a1 1 #判斷除數的高32位是否為0 若不為0被除數必定小於除數 直接進入移位部分 beq $t1 0 shift sleu $t1 $s0 $a0 #判斷除數是否大於餘數 若大於直接進入移位部分 beq $t1
0 shift sub $a0 $a0 $s0 #餘數不小於除數 餘數=餘數-除數 shift: sll $v0 $v0 1 #商左移一位 add $v0 $v0 $t1 #根據上面的判斷情況對最後一位置位:若餘數大於除數置1 否則置0 andi $t1 $a1 1 #$t1取除數的高32位的最後一位 srl $a1 $a1 1 #除數的高32位右移一位 srl $s0 $s0 1 #除數的低32位右移一位 sll $t1 $t1
31 #$t1左移31位 or $s0 $s0 $t1 #將除數的低32位與$t1取或 這樣便能將原先高32位最後一位成功右移到低32位 addi $t2 $t2 1 #計數器加1 slti $t1 $t2 33 #判斷執行次數是否達到33次 若未達到進入下一次迴圈 bne $t1 0 divv print: move $v1 $a0 #將餘數儲存到$v1 move $a0 $v0 #列印商 li $v0 1 syscall la $a0 space li $v0 4 syscall move $a0 $v1 #列印餘數 li $v0 1 syscall j exit print_error: #列印錯誤資訊 la $a0 error li $v0 4 syscall exit: #退出程式 li $v0 10 syscall