#--------------------------------------------------
#                 codigo em linguagem c
#--------------------------------------------------
#         main(void)
#          {
#             char s[20];
#             int n,p,cmb;
#             printf("Insira o n: ");
#             get (s,20);
#             n = atoi(s,20);
#             printf(" Insira o p ");
#             get(s,20);
#             p = atoi(s,20);
#             cmb = comb(n,p);
#             printf(" combinações  = ");
#             itoa(comb,s,20);  printf(s);
#          }
#--------------------------------------------------
#         int comb(int n, int p)
#         {
#           return fact(n) / (fact(p) * fact(n-p)  
#         }   
#---------------------------------------------------            
#          int fact (int n) /* algoritimo não - recursivo */   
#          {  
#           int i;  
#           int fct = 1;      
#           if (n<=1) 
#             return 1; 
#           else
#              for (i=2; i<=n; i++)
#                  fct = fct * i;
#              return fct;  
#---------------------------------------------------
                 .data
str:             .space 20
prompt1:         .asciiz"\nInsira o n: "
prompt2:         .asciiz"\ninsira o p: "
prompt3:         .asciiz"\nCombinações = "
prompt4:         .asciiz"\nResto="
                 .text
                 .globl main
    main:        la     $a0,prompt1
                 li     $v0,4
                 syscall 
                 la     $a0,str       # 
                 li     $v0,8       #
                 li     $a1,20       # Leitura de n
                 syscall   
                 jal    atoi          # invocação da função ATOI
                 move   $s0,$v0        # n=atoi(s,20)=$s0
   la     $a0,prompt2
                 li     $v0,4
                 syscall
                 la     $a0,str
                 li     $v0,8
                 li     $a1,20       # Leitura de p
                 syscall
                 jal    atoi          # invocação da função ATOI
                 move   $a1,$v0       # p=atoi(s,20)=$s1
   move   $a0,$s0
                 jal comb       # leitura de Combinações(n,p)
                 move   $s2,$v0       # $s2=comb(s,20)=cmb
   la     $a0,prompt3
                 li     $v0,4
                 syscall
   add   $a0,$0,$s2
                 la     $a1,str
                 li     $a2,20
                 jal itoa       # Invocação da função Itoa
                 la    $a0,str
                 li     $v0,4 
                 syscall
                 li     $v0,10
                 syscall           
#-------------------------------------------------------------------------
#  Função ATOI (Converte string para inteiro)
#
# Parametros de entrada n--> Tamanho da string
#    *s-> Array de string
# Retorno   num-->Nº imteiro   $v0=$t4
#------------------------------------------------------------------------
     atoi:       addi $sp,$sp,-4
   sw $ra,0($sp)   # salvaguardar os registos
   li     $v0,0               # num=0
                 add    $t1,$0,$a0          # p=s
                 add    $t2,$a0,$a1         # s+n
     while:      lb     $t3,0($t1)          # *p
                 bgeu   $t1,$t2,exit1       # if (p>=s+n) go to exit1
                 blt    $t3,'0',exit1       # if (*p<'0') go to exit1
                 bgt    $t3,'9',exit1       # if (*p>'9') go to exit1
                 sub    $t4,$t3,'0'         # digito= *p-'0'
                 mul    $v0,$v0,10          # num=10*num
                 add    $v0,$v0,$t4         # num=10*num+digito
                 addiu  $t1,$t1,1
                 j      while
    exit1:       lw $ra,0($sp)
   addi $sp,$sp,4 # Repor os registos
   jr     $ra
#-----------------------------------------------------------------
#                Função ITOA (Convert inteiro para string)
#  
# Parametros de entrada  n--> Nº inteiro
#    s--> Array de strings para retorno
# Retorno    --> String de caracteres
#-----------------------------------------------------------------
     itoa:  addi $sp,$sp,-4
   sw $ra,0($sp)   # salvaguardar os registos
   li $t1,10
   move $t0,$a0  
   move $t3,$a1
   li $t4,0  # i=0
   move $t5,$a0  # j=n
       do:  div $t5,$t1
   mfhi $t2             # parte concernente ao resto
   mflo $t0             # parte concernente ao quociente
   add $t2,$t2,'0' # resto + '0'
   sb $t2,0($t3)
   addiu $t3,$t3,1
   addi $t4,$t4,1
   move $t5,$t0  # $t5=Quociente
   bnez $t0,do
   sb $0,($t3) # coloca caracter nulo
#----------------------------------------------------------------------
#                procedimento  troca
#-----------------------------------------------------------------------  
   move $t1,$t3  # ponteiro para o fim do array
                 addi   $t1,$t1,-1
                 move   $t2,$a1         # ponteiro para o inicio do array
       if:       ble    $t1,$t2,fim     # if($t1<=$t2) go to fim 
   lb     $t4,0($t1)
   lb     $t5,0($t2)
                 sb     $t5,0($t1)
                 sb     $t4,0($t2)
                 addi   $t2,$t2,1
                 addi   $t1,$t1,-1
   j  if
   fim:   lw $ra,0($sp)
   addi $sp,$sp,4 # Repor os registos
   jr $ra
#-------------------------------------------------------------------
#   Função Calculo de combinações
#
# Parametros de entrada :   n,p
# Parametros de saida   :   cmb= n!/(p!(n-p)!)
#---------------------------------------------------------------------
  comb:   addi $sp,$sp,-12
   sw $ra,0($sp)
   sw $s0,4($sp)
   sw $s1,8($sp) # salvaguardar os registos
   move $s0,$a0  # n
   move $s1,$a1  # p
   sub $a0,$s0,$s1     # n-p
   jal fact1
   move   $a0,$s1  
                 move   $s1,$v0         # fact(n-p)
   jal fact1
   mul    $s1,$s1,$v0 # $s1=fact(p)*fact(n-p)
   move   $a0,$s0    
                 jal    fact1            # fact de (n)   
   div $v0,$v0,$s1 # fact(n) / fact(p)*fact(n-p)
   lw $s1,8($sp)      # Repor os registos
   lw $s0,4($sp)
   lw $ra,0($sp) 
   addi $sp,$sp,12 
   jr $ra
#-------------------------------------------------------------------------------------
#   Função  Factorial (não recursivo)
#
# Parametros de entrada :  inteiro
# Parametros de saida   :  fact=fact*i
#-------------------------------------------------------------------------------------
  fact1:  li $v0,1  # fct=1
                bgt $a0,$v0,fim1 # if(n<=1) 
                jr      $ra             # return fct
   fim1: li $t0,2  # i=2
   for:  bgt $t0,$a0,fim2 # while (i <= n)
  mul $v0,$v0,$t0 # fct=fct*i
  addi $t0,$t0,1       # i++
         b for
  fim2:         jr      $ra            # return fct
Read More