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
   

 

posted @ 2020-11-02 20:35  yanying  阅读(951)  评论(0编辑  收藏  举报