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

MIPS——無符號乘法

用MIPS實現mltu,積用$v1和$v0儲存。具體細節寫在註釋,如有錯誤請指正。

init:
    li $v0 5                #輸入被乘數$a0
    syscall
    addu $a0 $v0 $0       
    li $v0 5                #輸入乘數$a1
    syscall
    addu $a1 $v0 $0              
    li $s0 0                #$s0儲存被乘數左移後的高32位
    li $v0 0                #$v0儲存積的低32位
    li $v1 0                #$v1儲存積的高32位
    li $t2 
0 #$t2記錄過程執行次數 mull: andi $t1 $a1 1 #判斷乘數的最後一位是否為1 beq $t1 0 shift #最後一位不是1 進入移位部分 addu $v1 $v1 $s0 #積的高32位=積的高32位+被乘數的高32位 addu $v0 $v0 $a0 #積的低32位=積的低32位+被乘數的低32位 slt $t1 $v0 $a0 #判斷低32位相加時是否發生溢位 beq $t1 $0 shift #沒有溢位 進入移位部分 addiu $v1 $v1
1 #發生溢位 積的高32位加1 shift: srl $a1 $a1 1 #乘數右移一位 sll $s0 $s0 1 #先將被乘數的高32位左移一位 andi $t1 $a0 0x80000000 #判斷被乘數的低32位最高位是否為1 sll $a0 $a0 1 #被乘數的低32位左移一位 beq $t1 0 ad #被乘數的低32位最高位不是1 進入自增部分 addiu $s0 $s0 1 #被乘數的低32位最高位是1 高32位加1 ad: addiu $t2 $t2
1 #執行次數加1 slti $t1 $t2 32 #判斷是否已經執行32次 beq $t1 1 mull #還未執行32次 進入下一次迴圈 print1: move $s0 $v0 #先將積的低32位轉移 move $a0 $v1 #將積的高32位放到$a0 beq $a0 0 print2 #如果積的高32位為0 進入低32位輸出部分 li $v0 1 #列印積的高32位 syscall print2: move $a0 $s0 #將積的低32位放到$a0 li $v0 1 #列印積的低32位 syscall exit: li $v0 10 #退出程式 syscall