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
   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM