Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ##########################################################
- # Segment de dades
- ##########################################################
- .data 0x10000000
- cad_M: .asciiz "Introdueix M: "
- cad_Q: .asciiz "Introdueix Q: "
- cad_C: .asciiz "\nEl valor de C es: "
- ##########################################################
- # Segment de codi
- ##########################################################
- .globl __start
- .text 0x00400000
- ##########################################################
- # Métode principal que demana M i Q, crida a la subrutina
- # "multUnsigned" que imita l'esquema d'un multiplicador
- # per hardware de l'algorisme de multiplicació "a mà".
- #
- # Finalment s'imprimeix el registre equivalent a LO
- # per pantalla
- ##########################################################
- __start: la $a0,cad_M # print cad_M
- li $v0, 4 #
- syscall #
- li $v0, 5 # t0 = read_int
- syscall #
- move $t0,$v0 #
- la $a0,cad_Q # print cad_Q
- li $v0, 4 #
- syscall #
- li $v0, 5 # t0 = read_int
- syscall #
- move $a0,$t0 # multUnsigned (M,Q)
- move $a1,$v0 #
- jal multUnsigned #
- move $a0,$v1 # print_int (P)
- li $v0,1 #
- syscall #
- la $a0,cad_C # print cad_C
- li $v0, 4 #
- syscall #
- move $a0,$s0 # print_int (C)
- li $v0,1 #
- syscall #
- li $v0,10 # exit
- syscall #
- ##########################################################
- # Subrutina
- ##########################################################
- # M = $a0
- # Q = $a1
- # HI = $v0
- # LO = $v1
- multUnsigned: # Inicialització
- li $t0, 0x00000001 # Mascara de bits
- li $t1, 32 # n = 32
- li $s0, 0 # C
- addu $v0,$zero,$zero # HI = 0
- addu $v1,$zero,$a1 # LO = Q
- # Agafar Qi i analitzar-lo
- bucle: and $t2,$v1,$t0 # Agafe Qi
- beq $t2,$zero,bot # Si es 0, no suma
- # Suma
- addu $t6,$v0,$a0 # HI = HI + M
- slt $t7,$t6,$v0 # $t7 <- HI + M < HI
- slt $t8,$t6,$a0 # $t8 <- HI + M < M
- or $s0,$t7,$t8 # C = $t7 & $t8
- move $v0,$t6
- # Desplaçar
- bot: srl $v1,$v1,1 # Desplaçe LO 1 bit a la dreta
- and $t2,$v0,$t0 # Desplaçe el LSB de HI a LO
- sll $t2,$t2,31 #
- xor $v1,$v1,$t2 #
- srl $v0,$v0,1 # Desplaçe HI 1 bit a la dreta
- sll $t4,$s0,31 # Desplaçe C cap a HI
- xor $v0,$v0,$t4 #
- addi $t1,$t1,-1 # n--
- beqz $t1,fi # si n==0, acaba
- j bucle # bucleja
- fi: jr $ra # fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement