Fatorial em assembly

Publicado por Leonardo Weslei Diniz 10/06/2008

[ Hits: 12.246 ]

Homepage: http://www.agilesoft.com.br/

Download fatorial_exterminador3.s




Recursividade em assembly também é possível!

Fatorial em assembly.




Esconder código-fonte

#By Exterminador3
.data
   str1: .asciiz "\n\tDigite um valor : "
.text
.globl main.            #main()
main:         # Ponto de entrada...
      li $v0,4      # Pede ao utilizador o valor N
      la $a0,str1
      syscall            
      li $v0,5
      syscall             
      addi $a0,$v0,0   # Valor lido fica em a0
      jal fact      # call fact(n)
      addi $a0,$v0,0   # Escreve o resultado
      li $v0,1      
      syscall
      li $v0,10      # Fim...
      syscall

fact:
      sub $sp,$sp,8   # Ajusta a stack para 2 items
      sw $ra, 4($sp)   # Guarda endereço de retorno
      sw $a0, 0($sp)   # Guarda argumento n

      slt $t0,$a0,1   # testa se n < 1
      beq $t0,$zero,L1   # Se n >= 1, vai fazer outra chamada

      li $v0,1      # Se não for devolve 1
      add $sp,$sp,8   # liberta o espaço da stack antes de
      jr $ra      # retornar

L1:   sub $a0,$a0,1   # Nova chamada: novo argumento (n - 1)
      jal fact      # call fact com (n - 1)

         # Ponto de retorno da chamada recursiva:
      lw $a0, 0($sp)   # Recupera o argumento passado
      lw $ra, 4($sp)   # Recupera o endereço de retorno
      add $sp,$sp,8   # Liberta o espaço da stack

      mul $v0,$a0,$v0   # Calcula n * fact (n - 1)
      jr $ra            # Retorna com o resultado

Scripts recomendados

FreeBSD Execve

Escrita de número em binário em Assembly Puro para Linux 64 bits (Nasm - Netwide Assembler)

GAS Inteiro para String (formato binário)

Escrita de um número em binário na tela em Assembly Puro para Linux 64 bits (GNU Assem

GAS Calculadora de um dígito

Comentários
[1] Comentário enviado por albertguedes em 11/06/2008 - 00:33h

Ai Leonardo. Cê não tem idéia de como tem gente carente de aprender assembler decentemente aqui no VOL.
Você é um dos poucos que publicaram isso, e faço votos pela sua iniciativa.
Tive medo de faltar comentários no código, que em assembler, código sem coments é o mesmo que não ler nada do código.
Só me diz uma coisa, esse código é pra 'nasm' mesmo ?

[2] Comentário enviado por leonardoweslei em 11/06/2008 - 13:38h

Cara eu só testei msm no Spim e no Xspim, e nos dois funciona direitinho.OK

[3] Comentário enviado por HelioCampos em 12/06/2008 - 08:01h

Como assembler é dependente de máquina e sistema operacional.
Seria bom vc dar as configurações e o sistema operacional em que vc está escrevendo a rotina.

[4] Comentário enviado por leonardoweslei em 12/06/2008 - 10:24h

Tem um programa chamado SPIM (para windows, para linux é XSPIM) ele roda programas em assembler MIPS.


Contribuir com comentário