用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位 sltu $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 36 #打印積的高32位 syscall print2: move $a0 $s0 #將積的低32位放到$a0 li $v0 36 #打印積的低32位 syscall exit: li $v0 10 #退出程序 syscall