用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