用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