Advertisement
nRikee

Algoritmo multiplicación a mano, por Software | ASM MIPS

Nov 22nd, 2012
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.             ##########################################################
  2.             # Segment de dades
  3.             ##########################################################
  4.             .data 0x10000000
  5. cad_M:      .asciiz "Introdueix M: "
  6. cad_Q:      .asciiz "Introdueix Q: "
  7. cad_C:      .asciiz "\nEl valor de C es: "
  8.  
  9.             ##########################################################
  10.             # Segment de codi
  11.             ##########################################################
  12.  
  13.             .globl __start
  14.             .text 0x00400000
  15.            
  16.             ##########################################################
  17.             # Métode principal que demana M i Q, crida a la subrutina
  18.             # "multUnsigned" que imita l'esquema d'un multiplicador
  19.             # per hardware de l'algorisme de multiplicació "a mà".
  20.             #
  21.             # Finalment s'imprimeix el registre equivalent a LO
  22.             # per pantalla
  23.             ##########################################################
  24.            
  25. __start:    la $a0,cad_M        # print cad_M
  26.             li $v0, 4           #
  27.             syscall             #
  28.             li $v0, 5           # t0 = read_int
  29.             syscall             #
  30.             move $t0,$v0        #
  31.            
  32.             la $a0,cad_Q        # print cad_Q
  33.             li $v0, 4           #
  34.             syscall             #
  35.             li $v0, 5           # t0 = read_int
  36.             syscall             #
  37.  
  38.             move $a0,$t0        # multUnsigned (M,Q)
  39.             move $a1,$v0        #
  40.             jal multUnsigned    #
  41.            
  42.             move $a0,$v1        # print_int (P)
  43.             li $v0,1            #
  44.             syscall             #
  45.            
  46.             la $a0,cad_C        # print cad_C
  47.             li $v0, 4           #
  48.             syscall             #
  49.            
  50.             move $a0,$s0        # print_int (C)
  51.             li $v0,1            #
  52.             syscall             #
  53.            
  54.             li $v0,10           # exit
  55.             syscall             #
  56.            
  57.            
  58.                 ##########################################################
  59.                 # Subrutina
  60.                 ##########################################################
  61.                 # M = $a0
  62.                 # Q = $a1
  63.                 # HI = $v0
  64.                 # LO = $v1
  65.            
  66. multUnsigned:   # Inicialització
  67.                 li $t0, 0x00000001          # Mascara de bits
  68.                 li $t1, 32                  # n  = 32
  69.                 li $s0, 0                   # C
  70.                 addu $v0,$zero,$zero        # HI = 0
  71.                 addu $v1,$zero,$a1          # LO = Q
  72.                
  73.                 # Agafar Qi i analitzar-lo
  74.         bucle:  and $t2,$v1,$t0             # Agafe Qi
  75.                 beq $t2,$zero,bot           # Si es 0, no suma
  76.                
  77.                 # Suma
  78.                 addu $t6,$v0,$a0            # HI = HI + M
  79.                 slt $t7,$t6,$v0             # $t7 <- HI + M < HI
  80.                 slt $t8,$t6,$a0             # $t8 <- HI + M < M
  81.                 or $s0,$t7,$t8              # C = $t7 & $t8
  82.                 move $v0,$t6
  83.                
  84.                 # Desplaçar
  85.         bot:    srl $v1,$v1,1               # Desplaçe LO 1 bit a la dreta
  86.        
  87.                 and $t2,$v0,$t0             # Desplaçe el LSB de HI a LO
  88.                 sll $t2,$t2,31              #
  89.                 xor $v1,$v1,$t2             #  
  90.                 srl $v0,$v0,1               # Desplaçe HI 1 bit a la dreta
  91.                
  92.                 sll $t4,$s0,31              # Desplaçe C cap a HI
  93.                 xor $v0,$v0,$t4             #
  94.                
  95.                 addi $t1,$t1,-1             # n--
  96.                 beqz $t1,fi                 # si n==0, acaba
  97.                 j bucle                     # bucleja
  98.         fi:     jr $ra                      # fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement